日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

java 8 lambda reduce_JDK8新特性Lambda表达式体验

發布時間:2023/11/27 生活经验 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 8 lambda reduce_JDK8新特性Lambda表达式体验 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

“Lambda 表達式”(lambda expression)是一個匿名函數,Lambda表達式基于數學中的λ演算得名,直接對應于其中的lambda抽象(lambda abstraction),是一個匿名函數,即沒有函數名的函數。Java 8的一個大亮點是引入Lambda表達式,使用它設計的代碼會更加簡潔。當開發者在編寫Lambda表達式時,也會隨之被編譯成一個函數式接口。

Lambda簡介

Lambda表達式的語法由參數列表、箭頭符號->和函數體組成。函數體既可以是一個表達式,也可以是一個語句塊。

比如:

(int x, int y) -> x + y;

具體的Lambda表達式的介紹可以看這篇博客,寫得挺詳細的。

Java Lambda表達式示例

下面就用一些例子來體驗一下Lambda表達式。

遍歷集合

比如我們現在要遍歷一個List:

List list = Arrays.asList("Hello", "JDK8", "and", "Lambda");

JDK8之前的寫法:

for (String s : list) {

System.out.println(s);

}

用Lambda表達式寫法:

list.forEach(s -> System.out.println(s));

可以看到,無論是代碼量和可讀性都得到了提高。

在此基礎上還可以再用隱式表達式進行簡化:

list.forEach(System.out::println);

匿名類

在Java中很多時候我們要用到匿名類,比如線程Runnable、FileFilter和Comparator等等。

而匿名類型最大的問題就在于其冗余的語法。

這里用Comparator做例子。

比如我們有一個Cat類,表示貓,有名字、高度和重量這些屬性。

package com.fengyuan.model;

import lombok.AllArgsConstructor;

import lombok.Data;

public @Data @AllArgsConstructor class Cat {

private String name;

private double height;

private double weight;

}

我們創建3只貓,存到List中:

List catList = new ArrayList<>();

// 請無視這些數據的合理性,我亂寫的

catList.add(new Cat("cat1", 10.3, 3.6));

catList.add(new Cat("cat2", 9.3, 4.6));

catList.add(new Cat("cat3", 9.5, 4.0));

然后我們現在要對這個List進行排序,但是現在不知道是要怎么排,所以我們要定義一個比較器,指定用高度或者是重量來排序。

JDK8之前的寫法:

// 指定用高度來排序

Collections.sort(catList, new Comparator() {

@Override

public int compare(Cat o1, Cat o2) {

if (o1.getHeight() > o2.getHeight()) {

return 1;

} else if (o1.getHeight() < o2.getHeight()) {

return -1;

} else {

return 0;

}

}

});

而用Lambda,可以這樣寫:

Collections.sort(catList, (o1, o2) -> {

if (o1.getHeight() > o2.getHeight()) {

return 1;

} else if (o1.getHeight() < o2.getHeight()) {

return -1;

} else {

return 0;

}

});

繼續用方法引用,可以簡寫到極致:

// 指定用重量排序

catList.sort(Comparator.comparing(Cat::getWeight));

// 要逆向排列也很簡單

catList.sort(Comparator.comparing(Cat::getWeight).reversed());

到最后這種寫法,已經簡寫到極致,而且可讀性非常高。

函數式接口

JDK8增加了一個新的包:java.util.function,它里面包含了常用的函數式接口,比如Predicate、Consumer,Function等等。

接下來就體驗一下Predicate和Consumer的用法。

我們現在有一個訂單類,有id,金額,運費這些屬性。這個訂單有一個折扣方法,我們希望能夠根據營銷活動,動態修改優惠方案。

Order類:

package com.fengyuan.model;

import java.util.function.Consumer;

import java.util.function.Predicate;

import lombok.AllArgsConstructor;

import lombok.Data;

public @Data @AllArgsConstructor class Order {

private long id;

private double payment;

private double freight;

// 優惠政策

public Order discount(Order order, Predicate predicate, Consumer consumer) {

// 滿足Predicate的條件,返回true

if (predicate.test(order)) {

// 接收訂單對象,對訂單對象進行處理

consumer.accept(order);

}

return order;

}

}

其中

Predicate:接收T對象并返回boolean。

Consumer:接收T對象,沒有返回值。

然后通過函數式編程,我們可以動態傳入我們的優惠方案,比如99包郵:

// 新建一個訂單,506.5的金額,10.0的運費

Order order = new Order(123, 506.5, 10.0);

// 滿足金額>=99的條件,則設置運費為0

order.discount(order,

o -> o.getPayment() >= 99,

o -> o.setFreight(0));

這樣一來,就能根據營銷活動,修改我們的優惠方案。

除此之外,Predicate對象之間還能運用與或非這些邏輯操作,比如:

predicate1.and(predicate2);

predicate1.or(predicate2);

Stream

這里的Stream和I/O流不同,它更像具有Iterable的集合類。

Stream API引入的目的在于彌補Java函數式編程的缺陷,讓java也支持map()、reduce()等函數式編程語言。

map

map(映射),將傳入的函數依次作用到序列的每個元素。

比如說,有一個字符串列表,我們現在給列表里每個字符串調用toLowerCase()方法,轉成小寫字母。

List list = Arrays.asList("Hello", "JDK8", "and", "Lambda");

轉成小寫,用collect()把Stream再轉回List,返回新的列表:

List newList = list.stream().map(s -> s.toLowerCase()).collect(Collectors.toList());

也可以返回一個字符串,指定連接符,我這里是用空格連接的:

String str = list.stream().map(s -> s.toLowerCase()).collect(Collectors.joining(" "));

也可以用隱式函數,String::toLowerCase來實現:

String str = list.stream().map(String::toLowerCase).collect(Collectors.joining(" "));

reduce

reduce(歸約),將集合中所有值結合起來。

將一個整型List,先進行map:每個數都翻一倍,再進行reduce:所有數加起來,得到結果:

List numbers = Arrays.asList(10, 20, 30, 40, 50);

int result = numbers.stream().map(num -> num * 2).reduce((r, num) -> r += num).get();

變量捕捉

一個簡單的例子,算出一個集合中最大值、最小值、平均值等等。

集合:

List numbers = Arrays.asList(4, 6, 65, 3, 44, 2, 17, 19);

計算:

int max = numbers.stream().mapToInt(x -> x).max().getAsInt();

int min = numbers.stream().mapToInt(x -> x).min().getAsInt();

long count = numbers.stream().mapToInt(x -> x).count();

double avg = numbers.stream().mapToInt(x -> x).average().getAsDouble();

int sum = numbers.stream().mapToInt(x -> x).sum();

也可以用IntSummaryStatistics類來得到統計結果:

IntSummaryStatistics stat = numbers.stream().mapToInt(x -> x).summaryStatistics();

int max = stat.getMax();

int min = stat.getMin();

long count = stat.getCount();

double avg = stat.getAverage();

long sum = stat.getSum();

結語

雖然平時項目的開發中還是比較少用到Lambda表達式,但是在以上這些體驗中,確實是感受到了它的魅力。

總結

以上是生活随笔為你收集整理的java 8 lambda reduce_JDK8新特性Lambda表达式体验的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。