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);
  
   //方法三
   A a = bList().stream().filter(b -> "test".equals(b.getName())).findAny().get();
   結果后面發現這個方法三 並不是找得到就返回,找不到就不做處理,而是找不到直接拋異常了。 如果刪除方法一,只執行方法二,則不會出現異常。為什么呢? 具體分析: 首先方法一種,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() {

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM