java8 stream

使用Stream类进行流操作之前,先了解一下四种最基本的函数式接口:

Predicate<T> 接口:一个T类型参数,返回boolean类型值。
boolean test(T t);
Lambda表达式基本写法:
Predicate<Integer> predicate = x -> x > 5;

Function<T, R> 功能接口:一个T类型参数,返回R类型值。
R apply(T t);
Lambda表达式基本写法:
Function<Integer, Integer> function = x -> x + 1;

Supplier<T> 接口:无参数,返回一个T类型值。
T get();
Lambda表达式基本写法:
Supplier<Integer> supplier = () -> 1;

Consumer<T> 接口:一个T类型参数,无返回值。
void accept(T t);
Lambda表达式基本写法:
Consumer<Integer> consumer = x -> System.out.println(x);
Consumer<Integer> consumer = System.out::println;//方法引用的写法

API代码示例
public class Test { 
	public static void main(String[] args) {
		List<String> features = Arrays.asList("Lambdas","Lambdas", "Default Method", "Stream API", "Date and Time API");
		
		//创建流Stream
		//1 静态方法of(java8接口可以带静态方法)
		Stream<String> sof = Stream.of("1","2","3");
		Stream<Integer> sof2 = Stream.of(1,2,3);
		//2 静态方法genarate,无序无限长的流
//		Stream<Double> sg = Stream.generate(()->Math.random());
//		sg.forEach(System.out::println);//会一直打印
		Stream<Double> sg = Stream.generate(()->Math.random()).limit(10);
		sg.forEach(System.out::println);//打印10个
		//3 静态方法iterate,有序无限长的流
		//类似于无限迭代,第一个元素为2,即seed,通过方法+2获得第二个元素4,即f(seed)
		//以第二个元素4为seed,获取第三个元素6,即f(f(seed))
		//seed,f(seed),f(f(seed))......
		Stream.iterate(2, seed->seed+2).limit(5).forEach(e->{System.out.println(e);});//2,4,6,8,10
		
		//集合元素个数,size
		features.stream().count();//5
		
		//截取
		features.stream().limit(2);
		
		//遍历
		features.forEach(System.out::println);//现有类的现有方法,直接作为参数
		
		//并集
		Stream.concat(Stream.of(1,2,3),Stream.of(4,5,6)).forEach(System.out::println);//1,2,3,4,5,6
		
		//去重
		features.stream().distinct().forEach(System.out::println);
		
		//跳过前n个元素
		features.stream().skip(3).forEach(System.out::println);
		
		//排序
		Stream.of(1,2,3).sorted();//自然顺序排序1,2,3
		Stream.of(1,2,3).sorted((e1,e2)->e2-e1);//3,2,1
		
		//获取第一个
		features.stream().findFirst();
		//获取随便一个
		features.stream().findAny();
		//获取最大/最小
		Stream.of(1,2,3).max((e1,e2)->e1-e2);//3,需要传入一个比较器Comparator
		//获取相关方法返回Optional类型容器,这个容器只存1个或0个元素
		//isPresent() 判断容器中是否有值。
		//ifPresent(Consume lambda) 容器若不为空则执行括号中的Lambda表达式。
		//T get() 获取容器中的元素,若容器为空则抛出NoSuchElement异常。
		//T orElse(T other) 获取容器中的元素,若容器为空则返回括号中的默认值。
		
		//验证
		features.stream().allMatch(e->e.length()>14);//false,所有元素都满足
		features.stream().anyMatch(e->e.length()>14);//true,任一满足即可
		features.stream().noneMatch(e->e.length()>14);//false,都不满足
		
		//过滤
		features.stream().filter(e->e.startsWith("D")).forEach(System.out::println);
		//多个Predicate参数过滤
		Predicate<String> p1 = e->e.startsWith("D");
		Predicate<String> p2 = e->e.length()>14;
		features.stream().filter(p1.and(p2)).forEach(System.out::println);
		
		//归约,折叠函数
		//流中的所有元素折叠成一个元素,一般求和,求平均值等
		Stream.of(1,2,3).reduce(0, (e1,e2)->e1+e2);//6,0是基数
		Stream.of(1,2,3).reduce(1, Integer::sum);//7
		
		//映射
		//1 map方法处理改变每个流元素
		//封装好的mapToDouble,mapToInt,mapToLong
		features.stream().map(e->e.toUpperCase());//创建一个新的流,每个元素全部大写
		//2 flatMap方法
		//不创建新流,参数也必须是一个流,但是原来的流不变
		//封装好的flatMapToDouble,flatMapToInt,flatMapToLong
		features.stream().flatMap(e->Stream.of(e.toUpperCase()));
		
		//转化
		List<String> list = features.stream().filter((e)->e.startsWith("D")).collect(Collectors.toList());
		//System.out.println(list);//[Default Method, Date and Time API]
		String str = features.stream().filter(e->e.startsWith("D")).collect(Collectors.joining(","));
		//System.out.println(str);//Default Method,Date and Time API
		features.stream().toArray();//转化为一个数组
		
		//peek
		//作用不太清楚,欢迎留言解答
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 8引入了Stream API,它是一种处理集合数据的新方Stream API提供了一种流操作的方,可以对集合进行过滤、映射、排序、聚合等操作,使得代码更加简洁、易读和高效。 Stream是一个来自数据源的元素队列并支持聚合操作。它可以是集合、数组、I/O channel、产生器等。Stream操作可以顺序执行,也可以并行执行。 Java 8 Stream API的特点包括: 1. 延迟执行:Stream操作通常是延迟执行的,只有在终止操作时才会触发实际的计算。 2. 内部迭代:Stream API使用内部迭代的方,不需要显地编写循环,使得代码更加简洁。 3. 函数编程:Stream API支持函数编程风格,可以通过Lambda表达来定义操作。 4. 并行处理:Stream API提供了并行处理的能力,可以充分利用多核处理器的优势,提高处理速度。 使用Stream API可以通过一系列的中间操作和终止操作来对集合进行处理。中间操作包括过滤、映射、排序等操作,终止操作包括聚合、收集、遍历等操作。 下面是一些常用的Stream操作方法: 1. filter(Predicate<T> predicate):根据指定条件过滤元素。 2. map(Function<T, R> mapper):将元素进行映射转换。 3. sorted(Comparator<T> comparator):对元素进行排序。 4. distinct():去除重复的元素。 5. limit(long maxSize):限制元素的数量。 6. skip(long n):跳过指定数量的元素。 7. forEach(Consumer<T> action):对每个元素执行指定操作。 8. collect(Collector<T, A, R> collector):将元素收集到集合中。 9. reduce(BinaryOperator<T> accumulator):对元素进行归约操作。 10. parallel():启用并行处理。 以上只是Stream API的一部分常用操作,还有更多的操作方法可以根据具体需求使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值