美文网首页bigdata
2. java8 形式实现单词个数统计(wordcount)

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

作者: 百炼 | 来源:发表于2018-12-18 17:41 被阅读0次

    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] + "]");
            }
        }
    

    相关文章

      网友评论

        本文标题:2. java8 形式实现单词个数统计(wordcount)

        本文链接:https://www.haomeiwen.com/subject/enulkqtx.html