date[2018-12-19]
前期准备
1.IntStream
上的操作只能产生原始整数: IntStream
的 map
操作接受的Lambda
必须接受int
并返回 int
(一个IntUnaryOperator
)。但是你可能想要生成另一类值,比如 Dish
。为此,你需要访问 Stream
接口中定义的那些更广义的操作。要把原始流转换成一般流(每个 int
都会装箱成一个Integer
),可以使用 boxed
方法
2.Stream API
提供了两个静态方法来从函数生成流: Stream.iterate
和 Stream.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 + "]");
}
}
网友评论