前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >强大的 Stream API(二)

强大的 Stream API(二)

作者头像
IT小马哥
发布2020-10-27 10:38:12
4050
发布2020-10-27 10:38:12
举报
文章被收录于专栏:Java Tale

Stream 的中间操作

多个中间操作可以连接起来形成一个流水线,除非流水 线上触发终止操作,否则中间操作不会执行任何的处理!而在终止操作时一次性全部处理,称为“惰性求值”。

代码语言:javascript
复制
    //创建一个集合
    List<Employee> employees=Arrays.asList(
            new Employee("张三",18,9999.99),
            new Employee("李四",58,5555.55),
            new Employee("王五",26,3333.33),
            new Employee("赵六",36,6666.66),
            new Employee("田七",12,8888.88),
            new Employee("田七",12,8888.88)
     );

筛选与切片

方 法

描 述

1

filter(Predicate p)

接收 Lambda , 从流中排除某些元素。

2

distinct()

筛选,通过流所生成元素的 hashCode() 和 equals() 去 除重复元素。

3

limit(long maxSize)

截断流,使其元素不超过给定数量。

4

skip(long n)

跳过元素,返回一个扔掉了前 n 个元素的流。 若流中元素 不足 n 个,则返回一个空流。与 limit(n) 互补

代码语言:javascript
复制
 /*  筛选与切片
     *  filter--接收Lambda,从流中排除某些元素。
     *  limit--截断流,使其元素不超过给定数量。
     *  skip(n)--跳过元素,返回一个扔掉了前n个元素的流。若流中元素不足n个,则返回一个空流。与limit(n) 互补
     *  distinct--筛选,通过流所生成元素的 hashCode() 和 equals() 去掉重复元素
     */
//内部迭代:迭代操作由 Stream API 完成
@Test
public void test1(){
    //中间操作:不会执行任何操作
    Stream<Employee> stream=employees.stream()
                            .filter((e) -> e.getAge()>35 );
    //终止操作:一次性执行全部内容,即 惰性求值
    stream.forEach(System.out::println);
}
//外部迭代
@Test
public void test2(){
    Iterator<Employee> it=employees.iterator();
    while(it.hasNext()){
        System.out.println(it.next());
    }
}

@Test
public void test3(){//发现“短路”只输出了两次,说明只要找到 2 个 符合条件的就不再继续迭代
    employees.stream()
             .filter((e)->{
                 System.out.println("短路!");
                 return e.getSalary()>5000;
             })
             .limit(2)
             .forEach(System.out::println);
}

@Test
public void test4(){
    employees.stream()
             .filter((e)->e.getSalary()>5000)
             .skip(2)//跳过前两个
             .distinct()//去重,注意:需要Employee重写hashCode 和 equals 方法
             .forEach(System.out::println);
}

映射

方 法

描 述

1

map(Function f)

接收一个函数作为参数,该函数会被应用到每个元 素上,并将其映射成一个新的元素。

2

mapToDouble(ToDoubleFunction f)

接收一个函数作为参数,该函数会被应用到每个元 素上,产生一个新的 DoubleStream。

3

mapToInt(ToIntFunction f)

接收一个函数作为参数,该函数会被应用到每个元 素上,产生一个新的 IntStream。

4

mapToLong(ToLongFunction f)

接收一个函数作为参数,该函数会被应用到每个元 素上,产生一个新的 LongStream。

5

flatMap(Function f)

接收一个函数作为参数,将流中的每个值都换成另 一个流,然后把所有流连接成一个流

代码语言:javascript
复制
 /*
     * 映射
     * map--接收Lambda,将元素转换成其他形式或提取信息。接收一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新元素。
     * flatMap--接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流
     */
    @Test
    public void test5(){
        List<String> list=Arrays.asList("aaa","bbb","ccc","ddd");
        list.stream()
             .map((str)->str.toUpperCase())
             .forEach(System.out::println);

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

        employees.stream()
                 .map(Employee::getName)
                 .forEach(System.out::println);

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

        Stream<Stream<Character>> stream=list.stream()
                                             .map(TestStreamAPI2::filterChatacter);
        stream.forEach((sm)->{
            sm.forEach(System.out::println);
        });

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

        Stream<Character> sm=list.stream()
                                 .flatMap(TestStreamAPI2::filterChatacter);
        sm.forEach(System.out::println);
    }

    public static Stream<Character> filterChatacter(String str){
        List<Character> list=new ArrayList<>();
        for (Character ch : str.toCharArray()) {
            list.add(ch);
        }
        return list.stream();
    }

    @Test
    public void test6(){//map和flatMap的关系  类似于 add(Object)和addAll(Collection coll)
        List<String> list=Arrays.asList("aaa","bbb","ccc","ddd");
        List list2=new ArrayList<>();
        list2.add(11);
        list2.add(22);
        list2.addAll(list);
        System.out.println(list2);
    }

排序

方 法

描 述

1

sorted()

产生一个新流,其中按自然顺序排序

2

sorted(Comparator comp)

产生一个新流,其中按比较器顺序排序

代码语言:javascript
复制
  //中间操作
    /*
     * 排序
     * sorted()-自然排序(按照对象类实现Comparable接口的compareTo()方法 排序)
     * sorted(Comparator com)-定制排序(Comparator)
     */
    @Test
    public void test7(){
        List<String> list=Arrays.asList("ccc","bbb","aaa");
        list.stream()
            .sorted()
            .forEach(System.out::println);

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

        employees.stream()
                 .sorted((e1,e2)->{
                     if(e1.getAge().equals(e2.getAge())){
                         return e1.getName().compareTo(e2.getName());
                     }else{
                         return e1.getAge().compareTo(e2.getAge());
                     }
                 }).forEach(System.out::println); 

本文由 小马哥 创作,采用 知识共享署名4.0 国际许可协议进行许可 本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名 最后编辑时间为: 2020/10/26 19:57

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-10-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Stream 的中间操作
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档