java8 stream接口 终端操作 min,max,findFirst,findAny

    // 方法一  https://www.cnblogs.com/secbro/p/11685681.html
    Integer id = list.stream().map(Foo::getId).findAny().orElse(null);
    // 方法二
    Integer id = list.stream().findAny().map(Foo::getId).orElse(-1);

    如果删除方法一,只执行方法二,则不会出现异常。为什么呢?
    具体分析:
    首先方法一种,list.stream().map(Foo::getId)通过map,对原来的Stream进行了转换,生成了一个新的Stream,而该Stream中值是Foo的id属性,默认为null。针对一个元素为null的Stream调用findAny(),当然就抛出异常了。
    而方法二,list.stream().findAny()获得是Optional,然后对Optional调用map方法获得的是Optional,而Optional里面的值为null,再调用orElse方法却不会出现问题。
public static void testStream2ResultOperation() {
        List<String> strs = Arrays.asList("d", "b", "a", "c", "a");
        Optional<String> min = strs.stream().min(Comparator.comparing(Function.identity()));
        Optional<String> max = strs.stream().max((o1, o2) -> o1.compareTo(o2));
        System.out.println(String.format("min:%s; max:%s", min.get(), max.get()));// min:a; max:d

        Optional<String> aa = strs.stream().filter(str -> !str.equals("a")).findFirst();//d
        Optional<String> bb = strs.stream().filter(str -> !str.equals("a")).findAny();//d

        Optional<String> aa1 = strs.parallelStream().filter(str -> !str.equals("a")).findFirst();//d
        Optional<String> bb1 = strs.parallelStream().filter(str -> !str.equals("a")).findAny();//? 返回的是最快处理完的那个线程的数据

        System.out.println(aa.get() + "===" + bb.get());// d===d
        System.out.println(aa1.get() + "===" + bb1.get());// d===b or d===c
    }
// Optional$findAny 操作
    public static void testOptional$findAny() {
        List<Map<String, Object>> mapList = Lists.newArrayList();
        Map<String, Object> map1 = Maps.newHashMap();
        map1.put("nameItem", "香蕉");
        map1.put("valueItem", 2);
        mapList.add(map1);
        Map<String, Object> map2 = Maps.newHashMap();
        map2.put("nameItem", "香蕉");
        map2.put("valueItem", 3);
        mapList.add(map2);

        Set<Integer> set = new HashSet<>();

        List<Object> value1 = mapList.stream()
                .map(o -> {
                    Optional<Object> option = o.entrySet().stream()
                            .findAny()
                            .filter(m -> m.getKey().equals("valueItem"))
                            .map(i -> {
                                Object value2 = i.getValue();
                                return value2;
                            })
//                            .orElse("") //亦可以用orElse
                            ;
                    option.ifPresent(r -> set.add(Integer.valueOf(r + "")));//存在则直接调用
                    return option.get();
                }).collect(Collectors.toList());
        System.out.println("-1->" + set);
        System.out.println("-1->" + value1);
    }

原文地址:https://www.cnblogs.com/hahajava/p/12103824.html

时间: 2024-08-01 13:41:40

java8 stream接口 终端操作 min,max,findFirst,findAny的相关文章

java8 stream流操作

Stream 在对流进行处理时,不同的流操作以级联的方式形成处理流水线.一个流水线由一个源(source),0 到多个中间操作(intermediate operation)和一个终结操作(terminal operation)完成. 源:源是流中元素的来源.Java 提供了很多内置的源,包括数组.集合.生成函数和 I/O 通道等. 中间操作:中间操作在一个流上进行操作,返回结果是一个新的流.这些操作是延迟执行的. 终结操作:终结操作遍历流来产生一个结果或是副作用.在一个流上执行终结操作之后,该

Java8 新特性 Stream 非短路终端操作

非短路终端操作 Java8 新特性 Stream 练习实例 非短路终端操作,就是所有的元素都遍厉完,直到最后才结束.用来收集成自己想要的数据. 方法有: 遍厉 forEach 归约 reduce 最大值 max 最小值 min 聚合 collect 计数 count 遍厉 forEach //遍厉 forEach @Test public void forEachTest() { list.stream() .forEach(iter -> //以json格式输出 System.out.prin

【转】Java8 Stream 流详解

  当我第一次阅读 Java8 中的 Stream API 时,说实话,我非常困惑,因为它的名字听起来与 Java I0 框架中的 InputStream 和 OutputStream 非常类似.但是实际上,它们完全是不同的东西. Java8 Stream 使用的是函数式编程模式,如同它的名字一样,它可以被用来对集合进行链状流式的操作. 本文就将带着你如何使用 Java 8 不同类型的 Stream 操作.同时您还将了解流的处理顺序,以及不同顺序的流操作是如何影响运行时性能的. 我们还将学习终端

【java代码之美】---Java8 Stream

Stream 第一次看到Stream表达式就深深把我吸引,用它可以使你的代码更加整洁而且对集合的操作效率也会大大提高,如果你还没有用到java8的Stream特性,那就说明你确实out啦. 一.概述 1.什么是Stream Stream是一种可供流式操作的数据视图有些类似数据库中视图的概念它不改变源数据集合如果对其进行改变的操作它会返回一个新的数据集合. 总的来讲它有三大特性:在之后我们会对照着详细说明        1.stream不存储数据        2.stream不改变源数据    

java8中的流操作

https://www.ibm.com/developerworks/cn/java/j-experience-stream/index.html Stream 流是 Java 8 新提供给开发者的一组操作集合的 API,将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选.排序.聚合等.元素流在管道中经过中间操作(intermediate operation)的处理,最后由终端操作 (terminal operation) 得到前面处理的结果.Strea

Java8 Stream流方法

流是Java API的新成员,它允许以声明性方式处理数据集合(通过查询语句来表达,而不是临时编写一个实现).就现在来说,可以把它们看成遍历数据集的高级迭代器.此外,流还可以透明地并行处理,无需写任何多线程代码了! 流的使用一般包括三件事: •一个数据源(如集合)来执行一个查询: •一个中间操作链,形成一条流的流水线: •一个终端操作,执行流水线,并能生成结果. 流方法 含义 示例 filter (中间操作)该操作会接受一个谓词(一个返回boolean的函数)作为参数,并返回一个包括所有符合谓词的

Java8 Stream流使用及其基本原理

Stream流,是对集合对象操作的增强 基本使用 比如有一个Person类的集合:List<Person> personList,可以通过stream()对集合中的元素进行操作, 下面的操作流程可以归纳为 过滤-映射-收集. List<Integer> personIdList = personList.stream() //选出年龄大于20的Person对象 .filter(person -> person.getAge() > 20) //将Person对象映射成为

Java8 Streams 让集合操作飞起来

前言 接上篇文章 java8 新特性 由于上篇过于庞大,使得重点不够清晰,本篇单独拿出 java8 的 Stream 重点说明 ,并做了点补充. 基本说明 Stream 是基于 java8 的 lambda 表达式的,如果不清楚 lambda 表达式,可以查看我的上篇文章Lambda 表达式和函数式接口快速理解 Stream 把要处理的元素看做一种流,流在管道中传输,可以在管道的节点上处理数据,包含过滤,去重,排序,映射,聚合,分组等. Stream 分为中间操作和后期操作,中期操作会形成一个新

Java8 Stream初体验

如果你能说对下面这个语句的正确输出,那么恭喜你,这篇文章就不用看了~ List<Integer> nums = Arrays.asList(1,1,null,2,3,4,null,5,6,7,8,9,10); System.out.println("sum is:"+nums.stream().filter(num -> num != null).distinct(). mapToInt(num -> num * 2).peek(System.out::prin