今天整理了一波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
网友评论