Lambda使用——JDK8新特性
生活随笔
收集整理的這篇文章主要介紹了
Lambda使用——JDK8新特性
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- Lambda 簡介
- Lambda 表達式
- Lambda 常用測試
- Optional 常用方法測試
Lambda 簡介
Lambda表達式是JDK8的新特性,可以取代大部分的匿名內部類,寫出更簡潔更優雅的Java代碼,同時JDK也提供了大量的內置函數式接口供我們使用,使得Lambda表達式運用更加方便和高效。
Lambda 表達式
語法形式為 () -> {},其中 () 用來描述參數列表,{} 用來描述方法體,-> 為 lambda運算符 ,讀作(goes to)。
能夠接收Lambda表達式的參數類型,是一個只包含一個方法的接口。只包含一個方法的接口稱之為“函數接口”。
舉個例子:
創建一個線程
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新特性的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux运维:快速清空文本内容
- 下一篇: 简单总结过去的2021年