java8 Stream

做个记录:
Person.java

import lombok.Data;

/**
 * @Description:
 * @Author: ljf  <lin652210786@163.com>
 * @Date: 2019/12/02
 */
@Data
public class Person {
    private String name;
    private int age;
    public Person(String name,int age){
        this.name = name;
        this.age = age;
    }
}

新建测试类:test.java

import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;

import static java.util.stream.Collectors.toList;

/**
 * @Description:  java8 Stream
 * @Author: ljf  <lin652210786@163.com>
 * @Date: 2019/12/02
 */
public class listtest {

    //java8 Stream
    public static void main(String[] args) {
        List<Person> list = new ArrayList<>();
        list.add(new Person("jack", 27));
        list.add(new Person("mike", 25));
        list.add(new Person("tom", 30));
        list.add(new Person("age", 31));

        //1.0 根据条件返回集合
        List a = new ArrayList();
        //filter(T -> boolean)
        a = list.stream().filter(Person -> Person.getAge() > 20).collect(toList());

        //2.0 distinct() 去重
        List<Person> list1 = new ArrayList<>();
        {
            list1.add(new Person("Core Java", 200));
            list1.add(new Person("Core Java", 200));
            list1.add(new Person("Learning Freemarker", 150));
            list1.add(new Person("Spring MVC", 300));
            list1.add(new Person("Spring MVC", 300));
        }
        long l1 = list.stream().distinct().count();
        System.out.println("No. of distinct books:"+l1);
        list1.stream().distinct().forEach(b -> System.out.println(b.getName()+ "," + b.getAge()));

        //2.1 去重
        List<String> list2 = Arrays.asList("AA", "BB", "CC", "BB", "CC", "AA", "AA");
        long l2 = list2.stream().distinct().count();
        System.out.println("No. of distinct elements:"+l2);
        String output = list2.stream().distinct().collect(Collectors.joining(","));
        System.out.println(output);

        //2.2 去重
        List<Person> list3 = new ArrayList<>();
        {
            list3.add(new Person("Core Java", 200));
            list3.add(new Person("Core Java", 300));
            list3.add(new Person("Learning Freemarker", 150));
            list3.add(new Person("Spring MVC", 200));
            list3.add(new Person("Hibernate", 300));
        }
        list3.stream().filter(distinctByKey(b -> b.getName()))
                .forEach(b -> System.out.println(b.getName()+ "," + b.getAge()));


        //3.0 排序
        //根据年龄大小来比较:
        /*list = list.stream()
                .sorted((p1, p2) -> p1.getAge() - p2.getAge())
                .collect(toList());*/

        //3.1 简化排序
        /*list = list.stream()
                .sorted(Comparator.comparingInt(Person::getAge))
                .collect(toList());*/

        //4.0 limit(long n)
        //返回前 n 个元素
        /*list = list.stream()
                .limit(2)
                .collect(toList());*/

        //5.0 skip(long n)
        //去除前 n 个元素
        /*list = list.stream()
                .skip(2)
                .collect(toList());*/

        // 5.1  先获取list集合的前两位元素 在获取的元素中取出第一位元素
        //limit  和 skip 灵活运用
        /*list = list.stream()
                .limit(2)
                .skip(1)
                .collect(toList());*/


        //6.0 map(T -> R)
        //将流中的每一个元素 T 映射为 R(类似类型转换)
        /*List<String> newlist =
                list.stream().map(Person::getName).collect(toList());*/


        //7.0 flatMap(T -> Stream)
        //将流中的每一个元素 T 映射为一个流,再把每一个流连接成为一个流
        //首先 map 方法分割每个字符串元素,但此时流的类型为 Stream,因为 split 方法返回的是 String[ ] 类型;
        // 所以我们需要使用 flatMap 方法,先使用Arrays::stream将每个 String[ ] 元素变成一个 Stream流,
        // 然后 flatMap 会将每一个流连接成为一个流,最终返回我们需要的 Stream
        List<String> list4 = new ArrayList<>();
        list4.add("aaa bbb ccc");
        list4.add("ddd eee fff");
        list4.add("ggg hhh iii");

        list4 = list4.stream().map(s -> s.split(" ")).
                flatMap(Arrays::stream).collect(toList());


        //8.0 anyMatch(T -> boolean)
        //流中是否有一个元素匹配给定的 T -> boolean 条件
        //是否存在一个 person 对象的 age 等于 20:
        boolean b = list.stream().anyMatch(person -> person.getAge() == 27);

        //9.0 allMatch(T -> boolean)
        //流中是否所有元素都匹配给定的 T -> boolean 条件
        boolean b1 = list.stream().allMatch(person -> person.getAge() == 27);

        //10.0 noneMatch(T -> boolean)
        //流中是否没有元素匹配给定的 T -> boolean 条件


        //11.0 findAny() 和 findFirst()
        //findAny():找到其中一个元素 (使用 stream() 时找到的是第一个元素;使用 parallelStream() 并行时找到的是其中一个元素)
        //findFirst():找到第一个元素
        //String b2 = list.stream().findFirst(person -> person);
        Person a5 = list.stream().filter(b5 -> "age".equals(b5.getName())).findAny().get();
        //添加orElse() 可以在不满足条件的情况下 自定义返回值  不会跑出异常
        Person a6 = list.stream().filter(b5 -> "age11".equals(b5.getName())).findAny().orElse(null);;
        System.out.println(a6);


        //13.0 计算年龄总和: 其中,reduce 第一个参数 0 代表起始值为 0,lambda (a, b) -> a + b 即将两值相加产生一个新值。
        int sum = list.stream().map(Person::getAge).reduce(0, (a1, c1) -> a1 + c1);
        //与之相同:
        int sum1 = list.stream().map(Person::getAge).reduce(0, Integer::sum);

        //计算年龄总乘积:
        int sum2 = list.stream().map(Person::getAge).reduce(1, (a2, c2) -> a2 * c2);
        //当然也可以
        Optional<Integer> sum3 = list.stream().map(Person::getAge).reduce(Integer::sum);

        //14.0 count()
        //返回流中元素个数,结果为 long 类型
        long l3 = list.stream().count();

        //15.0 collect()
        //收集方法,我们很常用的是 collect(toList()),当然还有 collect(toSet()) 等,参数是一个收集器接口,这个后面会另外讲。

        Set<Person> set = list.stream().collect(Collectors.toSet());

        //16.0 forEach()
        //返回结果为 void,很明显我们可以通过它来干什么了
        list.stream().forEach(System.out ::println);

        //向数据库插入新元素:
        //list.stream().forEach(PersonMapper::insertPerson);

        System.out.println("-------------------");
    }

    //distinct()功能
    private static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
        Map<Object,Boolean> seen = new ConcurrentHashMap<>();
        return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
    }

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345