Java8新特性-Lambda表达式与Stream API

简介

Stream是Java 8的新特性。Stream让开发者能够以一种声明的方式处理数据源,将处理的数据源看做一种Stream(流),Stream(流)在Pipeline(管道)中传输和运算,支持的运算包含筛选、排序、聚合等,当到达终点后便得到最终的处理结果。

Lambda表达式简介

简而言之,Lambda表达式可以用来实现匿名类,简化了代码。

举例:

测试用的函数式接口

package algorithm;

/**
 * 测试用的函数式接口(只有一个抽象方法的接口)
 * @author : kun
 * @date : 2021/2/26
 */
@FunctionalInterface
public interface Person {
    void run(String name,int age);
}

lambda表达式使用举例:

package algorithm;

import java.util.Arrays;
import java.util.List;

/**
 * 测试lambda表达式
 * @author : kun
 * @date : 2021/2/26
 */
public class TestLambda {
    public static void main(String[] args) {
        //1、lambda代替匿名内部类
        Person person = (name,age) -> {
            age = age+1;
            System.out.println(name+"明年就"+age+"岁了");
        };
        person.run("张三",11);

        //2、lambda表达式遍历集合 每个元素+1并输出
        List<Integer> list = Arrays.asList(1, 2, 3);
        list.forEach(item -> {
            item += 1;
            System.out.println(item);
        });
    }
}

双冒号是lambda表达式的一种简化形式,当lambda表达式实现函数与其他静态类或者实现类的方法有相同个数或形式入参的时候,可以简化表达,使用

类名(实例名) :: 方法名 如果方法为静态方法或者构造方法,冒号前为类名,如果方法为实例方法,冒号前为实例名

Stream的使用步骤

1、Stream的构建

常见的构建方式

  //数组:调用静态方法Stream.of()或者Arrays.stream()
  Stream stream1 = Stream.of(1,2,3);
  //集合对象:调用stream()串行流或者parallelStream()创建并行流
  List<String> list = Arrays.asList("a","b","c");
  Stream<String> stream2 = list.stream();
2、中间操作

filter

过滤掉某些元素,生成一个新的流

例如,筛选出List里大于30的元素

List<Integer> myList = list.stream().filter(i->i>30).collect(Collectors.toList());

map

对元素进行某种形式的转换

例如,将数组内的元素由Integer转为String

List<String> strList = list.stream().map(i->String.valueOf(i)).collect(Collectors.toList());

flatmap

如果map中对元素操作的函数返回的是一个流,但我们需要得到元素的集合,可以用flatMap进行合并,然后转换为一个集合

List<Integer> intgeterList = streamList.values().stream()
    .flatMap(i->i.stream()).collect(Collectors.toList());

limit

返回一个包含前n个元素的新的流,总元素小于n则返回原始流

List<Integer> myList = list.stream().limit(3).collect(Collectors.toList());

skip

跳过前n个元素,与limit相反

用limit和skip可以达到一个分页的效果,方法传入一页展示多少个元素pageSize以及页码pageNumber

List<Integer> page = list.stream()
                  .skip(pageNumber*pageSize)
                  .limit(pageSize).collect(Collectors.toList());

distinct

去重

sorted

排序

3、终止操作

首先是通过流中的元素,计算出想要的值,使用完这些方法之后流会被关闭

reduce

对流中的元素按照规则计算

例如:求和运算

Integer sum = stream1.reduce(Integer::sum).get();

max/min

返回流中最大值/最小值,返回类型为java.util.Optional,调用一下get()可以拿到具体值

Integer num = stream1.filter(i -> i > 1).max(Integer::compareTo).get();

findFirst/findAny

返回流中第一个值/任何一个匹配的元素,返回类型为java.util.Optional

anyMatch/allMatch/noneMactch

返回boolean,判断流中是否有匹配的元素

anyMatch存在匹配的元素,返回true

allMatch所有元素符合匹配规则,返回true

noneMatch没有元素匹配,返回true

或者,我们想要将流转为集合

例如:

收集流中数据到List中

List<Integer> collect = stream1.collect(Collectors.toList());

可指定为ArrayList

ArrayList<Integer> collect = stream1.collect(Collectors.toCollection(ArrayList::new));

将流中的字符换拼接起来

String collect = stream2.collect(Collectors.joining());

用"-"拼接

String collect = stream2.collect(Collectors.joining("-"));

其他的用法会在以后工作中用到再进行补充~

上一篇:Java8 Stream常用api总结(一)


下一篇:Java Stream API进阶篇