天天看點

JDK1.8新特性lambda表達式

JDK1.8新特性

  • lambda表達式
    • 建立匿名内部類
    • lambda和stream結合:過濾
    • lambda和stream結合:過濾+統計
    • lambda雙冒号的使用
    • lambda map和stream.forEach 差別
    • lambda map作用
    • Reduce的作用
    • ifPresent的作用
    • Optional
    • Collectors.groupingBy

lambda表達式

建立匿名内部類

// 1.8前建立匿名内部類
 	Converter<String ,Integer> converter = new Converter<String, Integer>() {
        @Override
        public Integer converter(String s) {
            return Integer.parseInt(s);
        }
    };
           
// 1.8後建立匿名内部類方法1
	Converter<String ,Integer> converter = (f) -> {
        return Integer.valueOf(f);
    };
           
// 1.8後建立匿名内部類方法2
	Converter<String ,Integer> converter = (f) -> Integer.parseInt(f);
           

lambda和stream結合:過濾

public static void main(String[] args) {
        // lambda與Stream結合使用
        // 建立Stream對象
        Stream<String> stream = Stream.of("aaa","bbb","ccc");
        // 清單轉Stream對象
        ArrayList<String> array = new ArrayList<String>();
        array.add("a");
        array.add("b");
        array.add("c");

        // 使用lambda表達式過濾出以"a"開頭的流
        stream.filter((s) -> s.startsWith("a")).forEach(s -> System.out.println(s)); // 列印aaa
        array.stream().filter(s -> s.startsWith("a")).forEach(s -> System.out.println(s)); // 列印a
    }
           

lambda和stream結合:過濾+統計

public static void main(String[] args) {
        // lambda與Stream結合使用
        // 建立Stream對象
        Stream<String> stream = Stream.of("aaa","bbb","ccc");

        // 使用lambda表達式過濾出以"a"開頭的流,并統計出過濾後的元素個數
        long count = stream.filter(s -> s.startsWith("a")).count();
        System.out.println(count); // 列印1
    }
           

lambda雙冒号的使用

public static void main(String[] args) {
        // lambda與Stream結合使用
        // 建立Stream對象
        Stream<String> stream = Stream.of("aaa","bbb","ccc");

        // 雙冒号的使用:将方法作為一個參數傳入到stream内部,使stream裡面的每一個參數都在該方法中執行一次
        stream.forEach(TestClass::printStr); // 列印aaa bbb ccc
    }

    public static void printStr(String str) {
        System.out.print(str + " ");
    }
           

lambda map和stream.forEach 差別

map 方法的用途是将舊資料轉換後變為新資料,是一種 1:1 的映射,每個輸入元素按照規則轉換成另一個元素。該方法是 Intermediate 操作

Stream<String> stream = Stream.of("a", "b", "c", "d");
	stream.map(String::toUpperCase).forEach(System.out::println);
           

lambda map作用

一般用于對集合資料做過濾,如擷取對象SapPurchaseTaskDetail中的id集合,可以使用

Reduce的作用

Reduce中文含義為:減少、縮小;而Stream中的Reduce方法幹的正是這樣的活:根據一定的規則将Stream中的元素進行計算後傳回一個唯一的值。

它有三個變種,輸入參數分别是一個參數、二個參數以及三個參數;

一個參數:

Stream<Integer> stream = Arrays.stream(new Integer[]{1, 2, 3, 4, 5, 6, 7, 8});
// 求最大值
stream.reduce((a, b) -> a >= b ? a : b).get();
           

兩個參數:

Stream<Integer> stream = Arrays.stream(new Integer[]{1, 2, 3, 4, 5, 6, 7, 8});
//求集合元素的和==>以初始值1作為開始,進行計算=1+1+2+3+4+5+6+7+8
Integer result = stream.reduce(1, Integer::sum);
           

ifPresent的作用

判斷是否為空,如果不為空,使用get

AList.stream() 
                          .filter(a -> "小明".equals(a.getUserName())) 
                          .findFirst()
                          .ifPresent(a -> {
                              a.setUserName("明明");
                          })
           

Optional

主要是用于判斷是否為空,主用于鍊式程式設計

精華文章 : https://www.cnblogs.com/zhangboyu/p/7580262.html
           

Collectors.groupingBy

用于分組,返加一個map集合

繼續閱讀