java8的新特性[3](仅为个人看法的读书笔记)

全篇简介

这一篇想聊一下我认知到的Stream流,其实也是一种相对于之前版本简化代码量的方法,首先来做一个思考。

思考

如何筛选出列表中所有3的倍数

分析

以前的话我们基本上会采用一个for循环来实现这个操作

	List<Integer> list = new ArrayList<>();
	for (final Integer num : nums){
	    if (num % 3 == 0) {
	        list.add(num);
	    }
	}

代码量虽然也不多但是仍然可以通过Stream流简化。

简化之后的代码:

List<Integer> list = nums.stream().filter(num -> num % 3 == 0).collect(Collectors.toList());

这行语句的含义是stream()操作将集合转换成一个流,再调用一个类似collect 的及早求值方法返回集合,使用filter过滤器来遍历数据并检查其中的元素,其中过滤的条件表达式用Lambda表达式书写。

变式

上面提到的这种用法是Stream流的其中一个常见用法,另一种常见用法是用到forEach

List<Integer> list = nums.stream().forEach(num -> System.out.println(num));

同样也是使用到了Lambda表达式,作用是输出集合中元素,式子里接收一个 Lambda 表达式。

方法

下面说说Stream流下的一些方法:

1.map
如果有一个函数可以将一种类型的值转换成另外一种类型。map 操作就可以使用该函数,将一个流中的值转换成一个新的流。

package test;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
 
public class t2 {
	public static void main(String[] args) {
		List<String> list = new ArrayList<>();
		list.add("sdf");
		list.add("a");
		list.add("asdf");
		list.add("d");
		list.add("basdfgh");
		List<String> list2 = list.stream()
				.map((s) -> s.toUpperCase())
				.collect(Collectors.toList());
		list2.forEach(System.out :: println);
	}
}

上述代码的作用就是转换元素由小写到大写。
它还有一个进阶版本的flatMap ,但是我还没弄明白,这里就先不介绍了

2.filter
这个方法在上面也用过了,大致的作用都是用于筛选的

package test;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
 
public class t2 {
	public static void main(String[] args) {
		List<String> list = new ArrayList<>();
		list.add("sdf");
		list.add("a");
		list.add("asdf");
		list.add("d");
		list.add("basdfgh");

		List<String> list2 = list.stream()
				.filter((s) -> s.length() > 3)
				.collect(Collectors.toList());
		list2.forEach(System.out :: println);
	}
}

上述代码的效果就是筛选字符长度大于3的元素。
其中还有limit等,都是在其筛选结果上做文章

package test;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
 
public class t2 {
	public static void main(String[] args) {
		List<String> list = new ArrayList<>();
		list.add("sdf");
		list.add("a");
		list.add("asdf");
		list.add("d");
		list.add("basdfgh");

		List<String> list2 = list.stream()
				.filter((s) -> s.length() > 3)
				.limit(2)
				.collect(Collectors.toList());
		list2.forEach(System.out :: println);
	}
}

这样的操作就意味着它只会采集收集到的前面两个数据。

3.reduce
简单来说就是把Stream流中的不同元素归并为同一个元素,java8中它所支持的reduce方法主要有三种,简单区分就是可以分为一种参数,两种参数和三种参数的归并。我们这里介绍一种参数的归并。

package test;


import java.util.ArrayList;
import java.util.List;
 
public class t2 {
	public static void main(String[] args) {
		List<Long> list = new ArrayList<>();
		
		for (long i = 1; i <= 100; i++) {
			list.add(i);
		}
		
		Long sum = list.stream()
				.filter(s -> s % 2==0)
				.reduce(0L, (r, l) -> r + l);
		
		System.out.println(sum);
	}
}

上述代码的意思就是求0-100内所有偶数之和。

4.更多方法就不一一介绍了

总结

Stream流是一个非常值得开发的工具,与Lambda表达式相结合总能起到意想不到的作用,在实战中使用这样的工具能减少不少的代码量,今天我所学习的新特性就是Stream流中的这几个基础方法,还有很多更加便捷的方法还没了解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值