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 words = Pattern.compile("[^\\p{javaLetter}]").splitAsStream(book);
//通过文件读取的行的Stream
Stream lines = Files.lines(Paths.get("/Users/buxuesong/Documents/svn_code/demo/test.txt"));
System.out.println(lines);
//通过Builder创建Stream.Builder
Stream.Builder builder = Stream.builder();
//可以通过链模式添加元素
builder.add("one").add("two").add("three");
//可以通过accept接受元素
builder.accept("four");
//将builder转换为Stream流
Stream 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
        .map(p -> p.getAge())//Stream
        .filter(age -> age>20)//Stream
        .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 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

你可能感兴趣的:(JAVA lambda Map filter reduce)