2. java8 形式实现单词个数统计(wordcount)

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方法让你把一个流中的每个值都换成另一个流,然后把所有的流连接起来成为一个流。

使用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());