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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Lambda使用——JDK8新特性

發布時間:2025/3/19 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Lambda使用——JDK8新特性 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • Lambda 簡介
  • Lambda 表達式
  • Lambda 常用測試
  • Optional 常用方法測試

Lambda 簡介

Lambda表達式是JDK8的新特性,可以取代大部分的匿名內部類,寫出更簡潔更優雅的Java代碼,同時JDK也提供了大量的內置函數式接口供我們使用,使得Lambda表達式運用更加方便和高效。

Lambda 表達式

語法形式為 () -> {},其中 () 用來描述參數列表,{} 用來描述方法體,-> 為 lambda運算符 ,讀作(goes to)。
能夠接收Lambda表達式的參數類型,是一個只包含一個方法的接口。只包含一個方法的接口稱之為“函數接口”。

舉個例子:
創建一個線程

// 創建一個匿名線程 Thread t = new Thread(new Runnable() {@Overridepublic void run() {System.out.println("hello world");} }); t.start();

Lambda方式創建一個匿名線程

// Lambda方式創建一個匿名線程 Thread t = new Thread(() -> System.out.println("hello world")); t.start();

Lambda 常用測試

User對象

package flinktest.method;import lombok.Data;@Data public class User {private String username;private String password;private Integer age; }

測試代碼如下:

package flinktest.method;import org.junit.Before; import org.junit.Test;import java.util.*; import java.util.concurrent.ThreadLocalRandom; import java.util.stream.Collectors;public class FunctionMethodTest {List<User> userList = new ArrayList<>();/*** 初始化參數*/@Beforepublic void init() {String[] usernames = {"韓菱紗", "柳夢璃", "云天河", "慕容紫英", "玄霄"};for (int i = 0, len = usernames.length; i < len; i++) {User user = new User();user.setUsername(usernames[i]);user.setPassword("123456");user.setAge(ThreadLocalRandom.current().nextInt(16, 18));userList.add(user);}System.out.printf("原始數據: ");System.out.println(userList);}/*** 獲取用戶名*/@Testpublic void testGetUsername() {userList.stream().forEach(e -> System.out.println(e.getUsername()));}/*** 找到第一個對象*/@Testpublic void testFindFirst() {Optional<User> user = userList.stream().findFirst();System.out.println(user.get());}/*** 計數*/@Testpublic void testCount() {long count = userList.stream().count();System.out.println(count);}/*** 過濾出來 age>=16 的對象*/@Testpublic void testFilter() {List<User> collect = userList.stream().filter(user -> user.getAge() >= 16).collect(Collectors.toList());System.out.println(collect);}/*** 按照id正序排列*/@Testpublic void testSorted() {List<User> collect = userList.stream().sorted(Comparator.comparing(User::getAge)).collect(Collectors.toList());System.out.println(collect);}/*** 按照id倒敘排列*/@Testpublic void testSortedReversed() {List<User> collect = userList.stream().sorted(Comparator.comparing(User::getAge).reversed()).collect(Collectors.toList());System.out.println(collect);}/*** 年齡求和*/@Testpublic void testSum() {int sum = userList.stream().mapToInt(User::getAge).sum();System.out.println(sum);}/*** 年齡求平均*/@Testpublic void testAverage() {Double average = userList.stream().mapToDouble(User::getAge).average().getAsDouble();System.out.println(average);}/*** 年齡最大最小*/@Testpublic void testMaxMin() {int max = userList.stream().mapToInt(User::getAge).max().getAsInt();System.out.println(max);int min = userList.stream().mapToInt(User::getAge).min().getAsInt();System.out.println(min);}/*** 年齡分組*/@Testpublic void testGroupBy() {Map<Integer, List<User>> collect = userList.stream().collect(Collectors.groupingBy(User::getAge));System.out.println(collect);}/*** 聚合函數測試*/@Testpublic void testAggregation() {//得到一個DoubleSummaryStatistics對象,里面包含dcompQty字段的各種統計值;如果是int類型或者是long類型,需要修改對應的對象DoubleSummaryStatistics qtySummary = userList.stream().collect(Collectors.summarizingDouble(e -> Double.valueOf(e.getAge())));Map<String, String> qtyMap = new HashMap<>();qtyMap.put("MAXNUM", String.valueOf(qtySummary.getMax())); //根據age分組后dcompQty的最大值qtyMap.put("MINNUM", String.valueOf(qtySummary.getMin())); //根據age分組后dcompQty的最小值qtyMap.put("SUMNUM", String.valueOf(qtySummary.getSum())); //根據age分組后dcompQty的和值qtyMap.put("AVGNUM", String.valueOf(qtySummary.getAverage())); //根據age分組后dcompQty的平均值qtyMap.put("COUNTNUM", String.valueOf(qtySummary.getCount())); //根據age分組后dcompQty的個System.out.println(qtyMap);} }

Optional 常用方法測試

package flinktest;import lombok.extern.slf4j.Slf4j; import org.junit.Test;import java.util.Arrays; import java.util.List; import java.util.Optional; import java.util.stream.Stream;import static org.junit.Assert.*;@Slf4j public class OptionalTest {/*** Optional.of 方法參數一定不能是null*/@Testpublic void testof() {Optional<String> optional = Optional.of("hello");assertTrue(optional.isPresent());}/*** Optional.ofNullable 方法參數可以是null*/@Testpublic void testofNullable() {Optional<String> optional1 = Optional.ofNullable(null);assertFalse(optional1.isPresent());Optional<String> optional2 = Optional.ofNullable("hello");assertTrue(optional2.isPresent());}/*** optional1.isPresent 判斷Optional是否有值返回值是boolean類型*/@Testpublic void testisPresent() {Optional<String> optional1 = Optional.ofNullable(null);assertFalse(optional1.isPresent());Optional<String> optional2 = Optional.ofNullable("hello");assertTrue(optional2.isPresent());}/*** optional1.ifPresent 如果Optional有值,執行后面的方法*/@Testpublic void testifPresent() {Optional<String> optional1 = Optional.ofNullable(null);optional1.ifPresent(name -> System.out.println(name));Optional<String> optional2 = Optional.ofNullable("hello");optional2.ifPresent(name -> System.out.println(name));}/*** orElse 返回Optional包裹的值,如果為null,則返回函數內的默認值*/@Testpublic void testorElse() {String nullName = null;String name = Optional.ofNullable(nullName).orElse("default");assertEquals("default", name);}/*** orElseGet 返回Optional包裹的值,如果為null,則返回函數內的默認值。* 區別于orElse的是orElseGet后面跟的是表達式方法,可以實現一些業務邏輯*/@Testpublic void testorElseGet() {String nullName = null;String name = Optional.ofNullable(nullName).orElseGet(() -> "default");assertEquals("default", name);}/*** get 獲取Optional里面的值。* 一定不能是null,null會拋出異常:java.util.NoSuchElementException: No value present* 如果不能確定是否有null,不建議直接使用get方法,可以使用orElseGet*/@Testpublic void testget() {String nullName = null;String name = Optional.ofNullable(nullName).get();System.out.println(name);}/*** map和flatMap均要求optional對象非空才執行mapper方法,二者均返回Optional對象。但是map會自動將計算結果封裝為Optional對象,而flatMap需要自己進行封裝*/@Testpublic void testmap() {List<String> list = Arrays.asList("hello world", "i love java");list.stream().map(String::toUpperCase).forEach(s -> System.out.println(s + ","));// 下面這一行會報語法錯誤 // list.stream().map(s -> Stream.of(s.split(" "))).map(String::toUpperCase).forEach(s -> System.out.println(s + ","));}/*** map和flatMap均要求optional對象非空才執行mapper方法,二者均返回Optional對象。但是map會自動將計算結果封裝為Optional對象,而flatMap需要自己進行封裝** 官方對flatmap的解釋:* Returns a stream consisting of the results of replacing each element of this stream with the contents of a mapped stream produced by applying the provided mapping function to each element.**/@Testpublic void testflatMap() {List<String> list = Arrays.asList("hello world", "i love java");list.stream().flatMap(s -> Stream.of(s.split(" "))).map(String::toUpperCase).forEach(s -> System.out.println(s + ","));} }

總結

以上是生活随笔為你收集整理的Lambda使用——JDK8新特性的全部內容,希望文章能夠幫你解決所遇到的問題。

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