jdk1.8新特性之stream流


在jdk1.5的時候,我們需要掌握枚舉:反射、注解、泛型。現在java14都出來了
jdk1.8的新特性:函數式接口、鏈式編程、stream流、lambda表達式 都掌握的怎么樣了?

本篇將着重說明 Stream 流的用法

面試題:

按條件篩選用戶,請你只用一行代碼完成!

  • 1、id 為偶數
  • 2、年齡大於24
  • 3、用戶名大寫
  • 4、用戶名倒排序
  • 5、輸出一個用戶

代碼(User 實體類省略):

package stream;

import com.coding.test.entity.User;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class StreamDemo {
    public static void main(String[] args) {
        User user1 = new User(1,"jim",23,"北京");
        User user2 = new User(2,"tom",24,"武漢");
        User user3 = new User(3,"echo",25,"深圳");
        User user4 = new User(4,"jerry",26,"上海");
        User user5 = new User(5,"bob",27,"北京");
        //數據庫、集合 : 存數據的
        // Stream:計算和處理數據交給 Stream
        List<User> users = Arrays.asList(user1, user2, user3, user4, user5);
        users.stream()
                .filter(u->{return u.getId()%2 == 0;})
                .filter(u->{return u.getAge() > 24;})
                .map(u->{return u.getName().toUpperCase();})
                .sorted((u1,u2)->{return u2.compareTo(u1);})
                .limit(1)
                .forEach(System.out::println);
    }
}

接下來我們深入看看stream流中都有些什么?

創建流:

//1.創建一個具體字符串流
Stream<String> stream1 = Stream.of("A", "B", "C", "D");
//2.創建一個Stream流Builder<Object>對象
Stream.Builder<Object> builder = Stream.builder();
//3.創建一個空的String 流
Stream<String> empty = Stream.empty();
//4.合並兩個流
Stream<String> concat = Stream.concat(stream1, empty);
//5.用迭代器創建無限流
Stream<Integer> iterate = Stream.iterate(1, x -> x + 1);
//6.生成 無限流
Stream<Double> generate = Stream.generate(() -> Math.random());
//7.collection的串行流  和並行流
List<String> list = Arrays.asList("1","2","3","4");
Stream<String> stream2 = list.stream();
Stream<String> stream3 = list.parallelStream();
//8.Arrays.stream創建一個數組流
IntStream stream = Arrays.stream(new int[]{1, 2, 3, 4});
//9.通過文件生成字符串流
Stream<String> stream = Files.lines(Paths.get("text.txt"), Charset.defaultCharset());

流的使用:

看的流的使用 也就是看users.stream()能點出來哪些東西,因為太多,這里就舉例說明常用的幾種:

1.filter過濾:

// 篩選出>3的數據
List<Integer> list = Arrays.asList(1,2,3,4);
list.stream().filter((i)->{return i > 3;}).forEach(System.out::println);
// 輸出4

2.limit限流

// 獲取未來7天的日期(順便看看iterate 和 generate的用法)
        Stream.iterate(LocalDate.now(), date -> date.plusDays(1)).limit(7).forEach(date-> {
            System.out.print(date+",");
        });
        // 輸出 2020-03-12,2020-03-13,2020-03-14,2020-03-15,2020-03-16,2020-03-17,2020-03-18,
        AtomicInteger a = new AtomicInteger(0);
        // 截取前三個隨機數 並打印
        // 寫在這里的 時候就想換行輸出下 加個計數器判斷下
        // 至於為什么用AtomicInteger計數而不是int
        // 因為“ Variable used in lambda expression should be final or effectively final”
        // AtomicInteger 在另一篇博客【並發編程之美-JUC]中有提到過 
        Stream.generate(()->Math.random()).limit(3).forEach(d->{
            a.getAndIncrement();
            if(a.get() > 1){
                System.out.print(d+",");
            }else{
                System.out.print("\n"+d+",");
            }
        });
        //輸出0.8662508892898771,0.26661993344781665,0.2584450405261183,

3.skip 跳出

//skip(n)去掉前n個元素的流
List<String> list = Arrays.asList("1","2","3","4");
//若流中元素不足n個,則返回一個空,與limit(n)互補。
list.stream().skip(3).forEach(System.out::print);
//輸出4

4.sorted排序

//倒序排列
List<String> list = Arrays.asList("1","3","5","2","4");
list.stream().sorted((o1, o2)->{return o2.compareTo(o1);}).forEach(System.out::print);
//輸出54321

5.distinct篩選

//去除重復數據
List<String> list = Arrays.asList("1","2","3","1","2");
list.stream().distinct().forEach(System.out::print);
//輸出123

6.映射

// 流式計算將實體中某兩個屬性對應組裝成key value的格式返回
// 項目中一般讀取數據字典 根據code 返回前台數據使用
Map<Integer, String> collect = users.stream()
.collect(Collectors.toMap(User::getId, User::getName));
System.out.println(collect.toString());
// 輸出{1=jim, 2=tom, 3=echo, 4=jerry, 5=bob}

// 獲取某個元素輸出對應的List
List<Integer> ids = users.stream().map(user - >user .getId()).collect(Collectors.toList());


//將user按adress 分組
Map<String, List<User>> addressMap = users.stream()
.collect(Collectors.groupingBy(User::getAddress));
System.out.println(addressMap.toString());
//輸出:{上海=[stream.User@52cc8049], 武漢=[stream.User@5b6f7412],
//深圳=[stream.User@27973e9b], 北京=[stream.User@312b1dae, stream.User@7530d0a]}

小結:以上就是stream 流的常見用法 至於規約 查找 匹配都用的都很少,暫且不再深入 ,關於lambda表達式和函數式接口后面會寫,還有一個很好玩的類Optional,后面也來寫寫看,奧利給!!!


免責聲明!

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



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