Java8-Lambda&StreamAPI

本文章参考CSDN等相关资料整理,用于巩固相关知识,侵删。

1. 概述

Java8中(较之前版本)添加了一定的特性,代码中推出了Lambda表达式,提供了强大的StreamAPI
。。。

2.Lambda

2.1 Lambda表达式简介

Lambda表达式通过->作为符号,同其他语言的Lambda表达式类似,采用(param) -> {func;}的格式
Lambda表达式所依赖的是Java8中提供的函数式接口,位于java.util.function包下,同时提供一个@FunctionalInterface检测一个接口是否是函数式接口。
e.g:

@FunctionalInterface
public interface Comsumer<T>{
	void accpet(T t);
	default Consumer<T> andThen(Consumer<? super T> after){
		Objects.requireNonNull(after);
		return (T t) -> {accept(t);after.accept(t);};
	}
}

Test
public class Test{
	public static void main(String[] args){
		Consumer consumer = x -> System.out.println(x);
		consumer.accept(1);
	}
}

2.2 四大函数式接口

消费型接口:Consumer 只有一个抽象方法accept(T),参数只有一个泛型T,无返回值。
//多个参数的话可以参考java.util.function.ObjLongConsumer
供给型接口:Supplier 只有一个抽象方法get(),无参数,返回值为泛型T
函数型接口:Function<T,R>只有一个抽象方法apply(T) 参数为T类型,返回值为R类型
断言型接口:Predicate,只有一个抽象方法Test(T),参数为T类型,返回值为boolean类型

3.StreamAPI

StreamAPI是Java8的一大亮点。它与java.io包中的xxxStream完全不同。Stream中间操作:多个中间操作可以连接起来形成流水线,除非流水线上某一个地方触发了终止操作,否则中间不会执行任何处理!而终止操作时会一次性全部处理(惰性处理)。

3.3 获取Stream

1.通过集合系列的Stream()parallelStream()方法获取流

List<Integer> list = new ArrayList<>();
Stream<Integer> stream = list.stream();

2.通过Arrays.Stream()把数据转换成流

int[] a = new int[]{1,2,3};
IntStream stream = Arrays.Stream(a);

3.通过Stream.of()方法创建流

Stream<Integer> stream = Stream.of(1,2,3);

4.创建无限流

Stream<Integer> stream = Stream.iterate(0,x->x+2);

3.2 Stream操作(筛选与分片、映射、排序、终结(规约、收集))

3.2.1 筛选和分片

filter()//参数:断言型接口,过滤操作
distinct()//参数:无,去重操作
limit()//参数:long,获取前几条数据
skip()//参数:long,跳过前几条数据,获取后面几条的

3.2.2 映射

map()//参数:函数型接口,对原数据处理返回处理后的数据
flatMap()//参数:函数型接口,把流A的数据一个一个整合到流B中。
eg:
List<String> l1 = Arrays.asList("a","b","c");
List<String> l2 = Arrays.asList("d","e");
l1.stream().flatMap(x->l2.map(y->x+y)).forEach(System.out::println);

3.3.3 排序

自然排序sorted
含参数sorted的自定义排序
//
Stream<Integer> stream = Stream.of(1,2,3);
stream.sorted().forEach(System.out.println);
//
Stream<Integer> stream = Stream.of(1,2,3);
stream.sorted((x,y)->Integer.compare(x,y) ).forEach(Sysrem.out.println);
/

3.3.4 终止操作

allMatch()//参数:断言型接口,检查是否匹配所有元素
anyMatch()//参数:断言型接口,检查是否有匹配元素
noneMatch()//参数:断言型接口,检查是否没有匹配所有元素
findFirst()//参数:无,返回第一个元素
findAny()//参数:无,返回当前流的任意元素
count()//参数:无,返回流的元素个数
max()//参数:无,返回流中最大值
min()//参数:无,返回流中的最小值
//归约
reduce(),将流中元素反复结合起来得到一个值
eg:
List<Integer> l = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
Integer reduce = l.stream().reduce(11,(x,y) -> x + y);//66
//收集
collect(Collector )
将流转换成其他形式
参数:Collector接口
返回值:对应转化的类型
Collectors.toList(),把List转换成List
Collectors.toMap(Function<? super T,? extends K> KeyMapper,Function<? super T,? extends  U> value Mapper)//转换成Map
toSet()//返回到Set中

eg:
List<User> users = Arrays.asList(new User("张三", 19, 1000),
                new User("张三", 58, 2000),
                new User("李四", 38, 3000),
                new User("赵五", 48, 4000)
        );
List<String> collect = users.stream().map(x -> x.getName()).collect(Collectors.toList());
Set<String> collect1 = users.stream().map(x -> x.getName()).collect(Collectors.toSet());
Map<Integer, String> collect2 = users.stream().collect(
	Collectors.toMap(
		x -> x.getAge(),
		x -> x.getName()
	)
);
       
//分组
使用Collectors.groupingBy(Function<? super T,? extends K> classfiler);
collect(Collector ) 分组到 Map(classkey,streamitem)
eg:
List<User> users = Arrays.asList(new User("张三", 19, 1000),
                new User("张三", 58, 2000),
                new User("李四", 38, 3000),
                new User("赵五", 48, 4000)
        );
Map<String, List<User>> collect3 = users.stream().collect(
	Collectors.groupingBy(x -> x.getName())
);
/*
{李四=[User{name='李四', age=38, salary=3000}], 张三=[User{name='张三', age=19, salary=1000}, User{name='张三', age=58, salary=2000}], 赵五=[User{name='赵五', age=48, salary=4000}]}
*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值