JAVA8流Stream

0.引言

Java8/JDK8是Oracle在2014年发布的正式版,距今已经过去了6年,2019年接触java8的我才来系统熟识Java8的特性,真是有点感觉有点跟不上节奏呀!
虽说感慨,但依旧为时不晚。不是有催人的语句:只要你愿意开始,什么时候都不晚嘛!
分块来学习吧!

1. .stream()

Stream(流)是一个来自数据源的元素队列并支持聚合操作

  1. Stream不会存储元素,而是一系列的操作
  2. 流的来源:集合、数组、I/O channel、产生器generator 等
  3. 聚合操作:filter, map, reduce, find, match, sorted等。

举个例子:使用.stream()变成流,然后进行一系列聚合操作。

List<Integer> list = Arrays.asList(1,3,4,2,6,2);
List<Integer> collect = list.stream().sorted().collect(Collectors.toList());
collect.forEach(System.out::println);

运行效果
在这里插入图片描述

生成流的方式有两种方式

  • stream() − 为集合创建串行流。
  • parallelStream() − 为集合创建并行流。

2.聚合函数

1、forEach

Stream 提供了新的方法 ‘forEach’ 来迭代流中的每个数据。以下代码片段使用 forEach 输出了10个随机数:
代码中System.out::println使用要看这

import java.util.Random;

/**
 * @author WangWenLei
 * @DATE: 2020/10/10
 **/
public class LearnJava8 {
    
    
    public static void main(String[] args) {
    
    
        Random random = new Random();
        random.ints().limit(10).forEach(System.out::println);
    }
}

效果如下:
在这里插入图片描述

2、map

map 方法用于映射每个元素到对应的结果,以下代码片段使用 map 输出了元素对应的平方数:

List<Integer> list = Arrays.asList(1,2,3,4,5);
list.stream().map(x->x*x).forEach(System.out::println);

执行截图:
在这里插入图片描述
应用:对象中取一个值来形成一个流可用map

List<User> userList = new ArrayList<>();
User user1 = new User(1L,"wenwen1","password",24,"[email protected]","yes");
User user2 = new User(2L,"wenwen2","password",25,"[email protected]","yes");
userList.add(user1);
userList.add(user2);
//去对象中的年龄
userList.stream().map(item -> item.getAge()).forEach(System.out::println);

效果截图:
在这里插入图片描述
当然前面我创建了User的对象如下:

package ink.poesy.life.pojo;

import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import lombok.experimental.Accessors;

import java.io.Serializable;

@Data
@AllArgsConstructor//有参构造
@NoArgsConstructor//无参构造
@ToString
@Accessors(chain = true)
public class User implements Serializable {
    
    
    private Long id;
    /**
     * 用户名
     */
    private String name;
    /**
     * 密码
     */
    private String password;

    /**
     * 年龄
     */
    private Integer age;

    /**
     * 邮箱
     */

    private String email;
    /**
    * 是否是VIP
    **/
    private String hasVip;
}

3、filter

filter 方法用于通过设置的条件过滤出元素。以下代码片段使用 filter 方法过滤出空字符串:

List<String> list = Arrays.asList("a","","b","","cc","x","dd");
list.stream().filter(item -> !item.trim().isEmpty()).forEach(System.out::println);
System.out.println("过滤前个数:"+list.size());
System.out.println("过滤后个数:"+list.stream().filter(item -> !item.trim().isEmpty()).count());

运行效果:
在这里插入图片描述

4、limit

limit 方法用于获取指定数量的流。

List<String> list = Arrays.asList("a","","b","","cc","x","dd");
list.stream().limit(3).forEach(System.out::println);

运行效果截图:得到了前3个
在这里插入图片描述

5、sorted

sorted 方法用于对流进行排序。

6、parallelStream

parallelStream 是流并行处理程序的代替方法。

List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
// 获取空字符串的数量
long count = strings.parallelStream().filter(string -> string.isEmpty()).count();
System.out.println(count);

实现效果如下:
在这里插入图片描述

7、Collectors

Collectors 类实现了很多归约操作,例如将流转换成集合和聚合元素。Collectors 可用于返回列表或字符串:

List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
//每个非空字符加一个a
List<String> collect1 = strings.stream().filter(item -> !item.isEmpty()).map(item -> item + 'a').collect(Collectors.toList());
System.out.println(collect1.toString());
String collect2 = strings.stream().filter(item -> !item.isEmpty()).collect(Collectors.joining("#"));
System.out.println(collect2);

执行效果:
在这里插入图片描述

8、统计

一些产生统计结果的收集器非常有用。它们主要用于int、double、long等基本类型上,它们可以用来产生类似如下的统计结果。

List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5,12);
IntSummaryStatistics intSummaryStatistics = numbers.stream().mapToInt(x -> x).summaryStatistics();
System.out.println("列表中平均数 : " + intSummaryStatistics.getAverage());
System.out.println("列表中个数 : " + intSummaryStatistics.getCount());
System.out.println("列表中最大数 : " + intSummaryStatistics.getMax());
System.out.println("列表中平均数 : " + intSummaryStatistics.getMin());
System.out.println("列表中总数 : " + intSummaryStatistics.getSum());

运行效果:
在这里插入图片描述

3.完整代码

package ink.poesy.life.service.learn.stream;

import ink.poesy.life.pojo.User;

import java.util.*;
import java.util.stream.Collectors;

/**
 * @author WangWenLei
 * @DATE: 2020/10/10
 **/
public class LearnJava8 {
    
    
    public static void main(String[] args) {
    
    
        Random random = new Random();
        random.ints().limit(10).forEach(System.out::println);

        List<Integer> list = Arrays.asList(1,2,3,4,5);
        list.stream().map(x->x*x).forEach(System.out::println);

        List<User> userList = new ArrayList<>();
        User user1 = new User(1L,"wenwen1","password",24,"[email protected]","yes");
        User user2 = new User(2L,"wenwen2","password",25,"[email protected]","yes");
        userList.add(user1);
        userList.add(user2);
        //去对象中的年龄
        userList.stream().map(item -> item.getAge()).forEach(System.out::println);

        List<String> list0 = Arrays.asList("a","","b","","cc","x","dd");
        list0.stream().filter(item -> !item.trim().isEmpty()).forEach(System.out::println);
        System.out.println("过滤前个数:"+list0.size());
        System.out.println("过滤后个数:"+list0.stream().filter(item -> !item.trim().isEmpty()).count());

        List<String> list1 = Arrays.asList("a","","b","","cc","x","dd");
        list1.stream().limit(3).forEach(System.out::println);

        Random random2 = new Random();
        random2.ints().limit(10).sorted().forEach(System.out::println);


        List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
        // 获取空字符串的数量
        long count = strings.parallelStream().filter(string -> string.isEmpty()).count();
        System.out.println(count);

        List<String> strings2 = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
        //每个非空字符加一个a
        List<String> collect1 = strings2.stream().filter(item -> !item.isEmpty()).map(item -> item + 'a').collect(Collectors.toList());
        System.out.println(collect1.toString());
        String collect2 = strings2.stream().filter(item -> !item.isEmpty()).collect(Collectors.joining("#"));
        System.out.println(collect2);

        List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5,12);
        IntSummaryStatistics intSummaryStatistics = numbers.stream().mapToInt(x -> x).summaryStatistics();
        System.out.println("列表中平均数 : " + intSummaryStatistics.getAverage());
        System.out.println("列表中个数 : " + intSummaryStatistics.getCount());
        System.out.println("列表中最大数 : " + intSummaryStatistics.getMax());
        System.out.println("列表中平均数 : " + intSummaryStatistics.getMin());
        System.out.println("列表中总数 : " + intSummaryStatistics.getSum());
    }
}

对应的User类

package ink.poesy.life.pojo;

import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import lombok.experimental.Accessors;

import java.io.Serializable;

@Data
@AllArgsConstructor//有参构造
@NoArgsConstructor//无参构造
@ToString
@Accessors(chain = true)
public class User implements Serializable {
    
    
    private Long id;
    /**
     * 用户名
     */
    @ApiModelProperty(value = "用户名",required = true)
    private String name;
    /**
     * 密码
     */
    @ApiModelProperty(value = "用户密码",required = true)
    @TableField(exist = false)
    private String password;

    /**
     * 年龄
     */
    @ApiModelProperty(value = "年龄",required = true)
    private Integer age;

    /**
     * 邮箱
     */
    @ApiModelProperty(value = "邮箱",required = true)
    private String email;

    @ApiModelProperty(value = "是否是VIP")
    private String isVip;
}

文章为学习笔记,参考:https://www.runoob.com/java/java8-streams.html

猜你喜欢

转载自blog.csdn.net/weixin_42119415/article/details/108993888