乐趣区

关于java:JAVA-lambda-Map-filter-reduce

明天整顿了一波 Lambda 的简单操作,就是 Map filter reduce 操作。有问题您就评论。
Stream
外部不存储 data
不会扭转 data
源实际上是任何一种起源,不分明外部元素数量

// 返回一个空的 Stream
Stream.empty();
// 返回一个 Singleton 的 Stream
Stream.of("one");
// 多个元素的 Stream
Stream.of("one","two","three")
// 创立一个有限的 one 的 Stream
Stream.generate(() -> "one");
// 创立一个有限的 Stream,第一个元素是“+”,第二个“++”,第三个“+++”顺次类推
Stream.iterate("+", s -> s+"+");
// 创立一个随机流的 Stream,ints()返回的是随机整数值
ThreadLocalRandom.current().ints();
// 通过字符拆分成 char 的 Stream
IntStream stream1 = "Hello".chars();
// 通过正则表达式创立的 Stream
String book = "";
Stream<String> words = Pattern.compile("[^\\p{javaLetter}]").splitAsStream(book);
// 通过文件读取的行的 Stream
Stream<String> lines = Files.lines(Paths.get("/Users/buxuesong/Documents/svn_code/demo/test.txt"));
System.out.println(lines);
// 通过 Builder 创立 Stream.Builder
Stream.Builder<String> builder = Stream.builder();
// 能够通过链模式增加元素
builder.add("one").add("two").add("three");
// 能够通过 accept 承受元素
builder.accept("four");
// 将 builder 转换为 Stream 流
Stream<String> stream2 = builder.build();
// 输入 stream 流的内容
stream2.forEach(System.out::println);

map()办法,能够扭转 stream 的类型
filter() 办法,不扭转 stream 的类型,然而可能会扭转 stream 外部的数量
peek() 办法,和 forEach 相似,然而能够返回 Stream,以供 filter 持续解决,peek 属于两头调用

//Map/filter/reduce
people.stream() //Stream<Person>
        .map(p -> p.getAge())//Stream<Integer>
        .filter(age -> age>20)//Stream<Integer>
        .forEach(System.out::println);

如何辨别终端调用还是两头调用,两头调用反会的还是流,如果不是流则为终端调用
skip() 办法,跳过从开始到第 n 个元素
limit() 办法,从开始限度到第 n 个元素

people.stream()
        .skip(2)
        .limit(3)
        .map(p -> p.getAge())
        .peek(System.out::println)
        .filter(age ->age>22)
        .forEach(System.out::println);

Match Reduction 的办法类型:
anyMatch(),allMatch(),noneMatch()返回后果均为 boolean,他们可能不会评估所有的元素的位次,因而被称为 short-circuiting terminal 短路终端操作。

boolean b = people.stream().anyMatch(p -> p.getAge()>20);

Find Reduction 的办法类型:findAny(),findFirst()

Stream.generate()留神肯定要应用 limit 办法,否则会有限循环上来

Stream<String> stream = Stream.generate(() -> "one");
stream.limit(4).forEach(System.out::println);
\\ 输入
one
one
one
one
stream = Stream.iterate("+", s -> s+"+");
stream.limit(5).forEach(System.out::println);
\\ 输入
+
++
+++
++++
+++++

IntStream

IntStream intStream = ThreadLocalRandom.current().ints();
intStream.limit(5).forEach(System.out::println);
\\ 输入
1259268410
-1738334784
-816674339
-2136871006
-366691383
退出移动版