Java Stream API

– Start

点击此处观看本系列配套视频。


从之前的例子我们可以看到,Stream 接口是 Java 函数式编程的核心接口,下面我们来了解一下 Stream 接口。

构造 Stream

通常我们都是调用 Java集合的 stream 方法得到 Stream 对象,当然还有其他一些方法得到 Stream 对象。

package shangbo.functional.demo13;

import java.util.ArrayList;
import java.util.stream.Stream;

public class App {
	public static void main(String[] args) {
		// 调用 Java 集合的 stream 方法得到 Stream 对象
		Stream<String> stream1 = new ArrayList<String>().stream();
		
		// 数组转 Stream
		Stream<String> stream2 = Stream.of(new String[] {"a", "b"});
		
		// 包含一个元素的 Stream
		Stream<String> stream3 = Stream.of("a");
		
		// 空 Stream
		Stream<String> stream4 = Stream.empty();
		
		// 将多个 Stream 组合成一个 Stream
		Stream<String> stream5 = Stream.concat(stream1, stream2);
	}
}

Steam 非终止方法(Non-terminal)

Steam 包含两种类型的方法,一种方法的返回值是 Steam, 这样我们就可以将多个方法调用连接起来,这种方法称为非终止方法,有以下方法。

Stream.filter()
Stream.distinct()
Stream.limit()
Stream.peek()
Stream.skip()
Stream.sorted()
Stream.map()
Stream.mapToDouble()
Stream.mapToInt()
Stream.MapToLong()
Stream.flatMap()
Stream.flatMapToDouble()
Stream.flatMapToInt()
Stream.flatMapToLong()

下面我们演示一下 skip, peek 和 flatMap 的用法,其他方法我们已经演示过了。

package shangbo.functional.demo14;

import java.util.ArrayList;
import java.util.List;

public class App {
	public static void main(String[] args) {
		List<List<String>> listOfList = new ArrayList<>();
		
		List<String> a = new ArrayList<>();
		a.add("a1");
		a.add("a2");
		listOfList.add(a);
		
		List<String> b = new ArrayList<>();
		b.add("b1");
		b.add("b2");
		b.add("b3");
		listOfList.add(b);
		
		// flatMap 用來复杂数据结构扁平化
		// skip 用来跳过指定数量的元素
		// peek 不对数据做任何修改
		listOfList.stream().flatMap(l->l.stream()).skip(2).peek(e->System.out.println(e)).count();
	}
}

Stream 终止方法

Stream 的另一种方法称为终止方法,有以下方法。

Stream.collect()
Stream.count()
Stream.min()
Stream.max()
Stream.allMatch()
Stream.anyMatch()
Stream.noneMatch()
Stream.findAny()
Stream.findFirst()
Stream.forEach()
Stream.forEachOrdered()
Stream.reduce()
Stream.toArray()
package shangbo.functional.demo15;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

public class App {
	public static void main(String[] args) {
		List<String> data = new ArrayList<>();
		data.add("one");
		data.add("two");
		data.add("three");

		// 是否找到匹配元素
		boolean anyMatch = data.stream().anyMatch(v -> v.equalsIgnoreCase("ONE"));
		System.out.println("anyMatch=" + anyMatch);

		// 是否匹配所有元素
		boolean allMatch = data.stream().allMatch(v -> v.equalsIgnoreCase("ONE"));
		System.out.println("allMatch=" + allMatch);

		// 是否沒有匹配元素
		boolean noneMatch = data.stream().noneMatch(v -> v.equalsIgnoreCase("ONE"));
		System.out.println("noneMatch=" + noneMatch);

		// 返回任意一個元素
		Optional<String> anyElement = data.stream().findAny();
		if (anyElement.isPresent()) {
			System.out.println("anyElement=" + anyElement.get());
		}

		// 返回第一個元素
		System.out.println("firstElement=" + data.stream().findFirst().orElse(null));

		// reduce 只返回一个值
		System.out.println("firstElement=" + data.stream().reduce((p1, p2) -> p1 + "," + p2).orElse(null));

		// Steam 转数组
		String[] array = data.stream().toArray(String[]::new);
	}
}

此外 Steram 的子接口中还有一些特殊的方法,请看 IntSteram, LongSteram , DoubleSteram API 文档。

– 更多参见:Java 函数式编程精萃
– 声 明:转载请注明出处
– Last Updated on 2019-06-01
– Written by ShangBo on 2019-06-01
– End

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值