date[2018-12-20]
前期准备
@Test
public void test() {
List<String> words = new ArrayList<>();
words.add("Hello");
words.add("World");
List<String[]> collect = words.stream()
.map(s -> s.split(""))
.distinct()
.collect(Collectors.toList());
}
map方式图解.png
传递给map方法的Lambda为每个单词返回了一个String[]
(String
列表)。因此,map返回的流实际上是Stream<String[]>
类型的
@Test
public void testFlatMap() {
List<String> words = new ArrayList<>();
words.add("Hello");
words.add("World");
List<String[]> collect = words.stream()
.map(s -> s.split(""))
.distinct()
.collect(Collectors.toList());
words.stream()
.map(s -> s.split(""))
.flatMap(Arrays::stream)
.distinct()
.collect(Collectors.toList());
}
flatMap方式图解.png
flatmap
方法让你把一个流中的每个值都换成另一个流,然后把所有的流连接起来成为一个流。
使用MapReduce方式实现单词个数统计
public static void wordCountReduce(List<String> list) {
int[] count = {1};
list.stream()
.flatMap(line -> Arrays.stream(line.split(" ")))
.sorted()
.reduce("", (preWorld, nowWorld) -> {
if (Objects.equals(preWorld, nowWorld)) {
count[0]++;
} else if (!Objects.equals("", preWorld)) {
System.out.println("preWorld:" + preWorld + "=" + count[0]);
count[0] = 1;
}
return nowWorld;
});
for (int i : count) {
System.out.println(i);
}
}
使用flatMap方式
public static Map<String, Long> wordCountCollection(List<String> list) {
return list.stream()
.flatMap(line -> Arrays.stream(line.split(" ")))
.collect(Collectors.groupingBy(p -> p, Collectors.counting()));
}
public static Map<String, Long> wordCountCollection2(List<String> list) {
return list.stream()
.map(w -> w.split(" "))
.flatMap(Arrays::stream)
.collect(Collectors.groupingBy(p -> p, Collectors.counting()));
}
/**
* 给定一个数字列表,如何返回一个由每个数的平方构成的列表呢?
* 2018/12/18 16:25
*/
@Test
public void testPow() {
List<Integer> integerList = Arrays.asList(1, 2, 3, 4, 5);
integerList.stream()
.map(val -> {
return val * val;
}).forEach(val -> {
System.out.println(val);
});
}
/**
* 给定两个数字列表,如何返回所有的数对呢?例如,给定列表[1, 2, 3]和列表[3, 4],应
* 该返回[(1, 3), (1, 4), (2, 3), (2, 4), (3, 3), (3, 4)]。为简单起见,你可以用有两个元素的数组来代
* 表数对。
*/
@Test
public void testPair() {
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(toList());
for (int[] pair : pairs) {
System.out.println("[" + pair[0] + "," + pair[1] + "]");
}
}
网友评论