bigdata

3. java8 实现求平均数(wordMean)

2018-12-19  本文已影响0人  百炼

date[2018-12-19]

前期准备

1.IntStream 上的操作只能产生原始整数: IntStreammap 操作接受的Lambda必须接受int并返回 int(一个IntUnaryOperator )。但是你可能想要生成另一类值,比如 Dish 。为此,你需要访问 Stream接口中定义的那些更广义的操作。要把原始流转换成一般流(每个 int都会装箱成一个Integer ),可以使用 boxed方法
2.Stream API提供了两个静态方法来从函数生成流: Stream.iterateStream.generate
这两个操作可以创建所谓的无限流:不像从固定集合创建的流那样有固定大小的流。由 iterate
generate 产生的流会用给定的函数按需创建值,因此可以无穷无尽地计算下去!一般来说,
应该使用 limit(n)来对这种流加以限制,以避免打印无穷多个值。

        IntStream intStream = IntStream.iterate(0, n -> n + 2).limit(10);
        Stream<Integer> boxed = IntStream.iterate(0, n -> n + 2).limit(10).boxed();
        
        DoubleStream generate = DoubleStream.generate(Math::random);
        Stream<Double> generateBox = Stream.generate(Math::random);

使用java8的方式求平均数

package action.mapreduce;

import org.junit.Test;
import java.util.stream.IntStream;
import java.util.stream.Stream;

class BoxPair {
    Integer data;
    Integer count;

    public BoxPair(Integer data, Integer count) {
        this.data = data;
        this.count = count;
    }
}
public class WordMean {
    /**
     * 使用new的方式构造BoxPair
     */
    @Test
    public void testWordMean1() {
        Stream<Integer> boxed = IntStream.iterate(0, n -> n + 2).limit(10).boxed();
        BoxPair reduce = boxed
                .map(val -> {
                    return new BoxPair(val, 1);
                }).reduce(new BoxPair(0, 0), (p, n) -> {
                    return new BoxPair(p.data + n.data, p.count + n.count);
                });

        System.out.println("Pair: data[" + reduce.data + "],count[" + reduce.count + "]");
    }

    /**
     * 使用Lambda表达式的形成构造BoxPair
     */
    @Test
    public void testWordMean2() {
        Stream<Integer> boxed = IntStream.iterate(0, n -> n + 2).limit(10).boxed();
        BoxPair reduce = boxed
                .map((v) -> new BoxPair(v, 1))
                .reduce(new BoxPair(0, 0), (p, n) ->
                        new BoxPair(p.data + n.data, p.count + n.count));

        System.out.println("Pair: data[" + reduce.data + "],count[" + reduce.count + "]");
    }
}
上一篇 下一篇

猜你喜欢

热点阅读