Java 8实战–Stream流的使用
1、Map–对流中每一个元素进行处理
2、flatMap–流扁平化,让你把一个流中的每个值都换成另一个流,然后把所有的流连接起来成为一个流
实践代码如下:
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class TestStreamMap
{
private static void testMap(List<String> strList)
{
// 返回的是String[],所以去重不正确
List<String[]> ret = strList.stream()
.map(str -> str.split(""))
.distinct()
.collect(Collectors.toList());
// print
ret.stream().forEach(strArr -> System.out.println(Arrays.asList(strArr).toString()));
}
private static void testFlatMap(List<String> strList)
{
List<String> ret = strList.stream()
.map(str -> str.split(""))
// 可以使每个数组变成一个单独的流
// .map(Arrays::stream)
// 将各个生成流扁平化为单个流,flatmap方法让你把一个流中的每个值都换成另一个流,然后把所有的流连接起来成为一个流
.flatMap(Arrays::stream)
.distinct()
// 字符串连接 Collectors.joining()
.collect(Collectors.toList());
System.out.println(ret.toString());
}
/**
* 给定两个数字列表,如何返回所有的数对呢?
* 例如,给定列表[1, 2, 3]和列表[3, 4],应该返回
* [(1, 3), (1, 4), (2, 3), (2, 4), (3, 3), (3, 4)]
*/
private static void testNumberArr()
{
List<Integer> numbers1 = Arrays.asList(1, 2, 3);
List<Integer> numbers2 = Arrays.asList(3, 4);
/**
List<int[]> pairs = numbers1.stream()
.flatMap(i -> numbers2.stream().map(j -> new int[]{ i, j }))
.collect(Collectors.toList());
// 打印单个元素
pairs.stream().flatMapToInt(Arrays::stream).forEach(System.out::println);
// output: 1 3 1 4 2 3 2 4 3 3 3 4
*/
List<Integer[]> pairs = numbers1.stream()
.flatMap(i -> numbers2.stream().map(j -> new Integer[]{ i, j }))
.collect(Collectors.toList());
pairs.stream().forEach(numberArr -> System.out.println(Arrays.asList(numberArr).toString()));
}
public static void main(String[] args)
{
String[] strArr = {"hello", "world"};
// List<String> strL = new ArrayList<>(); // <>运算符
List<String> strL = Arrays.asList(strArr);
testMap(strL);
testFlatMap(strL);
testNumberArr();
}
}
输出:
[h, e, l, l, o]
[w, o, r, l, d]
[h, e, l, o, w, r, d]
[1, 3]
[1, 4]
[2, 3]
[2, 4]
[3, 3]
[3, 4]
参考书籍:
《Java8实战》