关于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

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理