Stream流API的使用,意在使用java内部迭代来减少代码量,下面总结了一些常用的流方法:
- 从数组和集合中创建Java流
// 使用Stream.of()从相似类型的数据创建流
Stream<Integer> stream1 = Stream.of(1, 2, 3);
// 使用Stream.of()一个Object数组来返回流
Stream<Integer> stream2 = Stream.of(new Integer[] { 1, 2, 3, 4 });
// 使用Collection stream()来创建顺序流并parallelStream()创建并行流
List<Integer> myList = new ArrayList<>();
for (int i = 0; i < 100; i++)
myList.add(i);
// sequential stream
Stream<Integer> sequentialStream = myList.stream();
// parallel stream
Stream<Integer> parallelStream = myList.parallelStream();
// 使用Stream.generate()和Stream.iterate()方法来创建Stream
Stream<String> streamGenerate = Stream.generate(() -> {
return "abc";
});
Stream<String> streamIterate = Stream.iterate("abc", (i) -> i);
// 使用Arrays.stream()和String.chars()方法
LongStream is = Arrays.stream(new long[] { 1, 2, 3, 4 });
IntStream is2 = "abc".chars();
- 将Java Stream转换为集合或数组
Stream<Integer> intStream = Stream.of(1, 2, 3, 4);
List intList = intStream.collect(Collectors.toList());
System.out.println(intList);// prints [1, 2, 3, 4]
intStream = Stream.of(1, 2, 3, 4);// stream is closed, so we need to
// create it again
Map<Integer, Integer> intMap = intStream.collect(Collectors.toMap(i -> i, i -> i + 10));
System.out.println(intMap); // prints {1=11, 2=12, 3=13, 4=14}
// 使用stream toArray()方法从流中创建一个数组
Stream<Integer> intStreamNew = Stream.of(1, 2, 3, 4);
Integer[] intArray = intStreamNew.toArray(Integer[]::new);
System.out.println(Arrays.toString(intArray));// prints [1, 2, 3, 4]
- Java流中间操作
// Stream filter()示例:我们可以使用filter()方法测试条件的流元素并生成过滤列表。
List<Integer> myFilterList = new ArrayList<>();
for (int i = 0; i < 100; i++)
myFilterList.add(i);
Stream<Integer> streamList = myFilterList.stream();
// filter numbers greater than 90
Stream<Integer> stream = streamList.filter(p -> p > 90);
System.out.print("High Nums greater than 90=");
stream.forEach(p -> System.out.print(p + " "));// prints "High Nums
// greater than 90=91 92
// 93 94 95 96 97 98 99
// "
// Stream map()示例:我们可以使用map()将函数应用于流
Stream<String> names = Stream.of("aBc", "d", "ef");
Stream<String> nameStream = names.map(s -> {
return s.toUpperCase();
});
System.out.println(nameStream.collect(Collectors.toList()));
// Stream sorted()示例:我们可以使用sorted()通过传递Comparator参数来对流元素进行排序。
Stream<String> names2 = Stream.of("aBc", "d", "ef", "123456");
Stream streamDemo = names2.sorted(Comparator.reverseOrder());
List reverseOrder = (List) streamDemo.collect(Collectors.toList());
System.out.println(reverseOrder);// [ef, d, aBc, 123456]
Stream<String> names3 = Stream.of("aBc", "d", "ef", "123456");
List<String> naturalSorted = names3.sorted().collect(Collectors.toList());
System.out.println(naturalSorted); // [123456, aBc, d, ef]
// Stream flatMap()示例:我们可以使用flatMap()从列表流中创建流。让我们看一个清除这个疑问的简单例子
Stream<List<String>> namesOriginalList = Stream.of(Arrays.asList("Pankaj"), Arrays.asList("David", "Lisa"),
Arrays.asList("Amit"));
// flat the stream from List<String> to String stream
Stream<String> flatStream = namesOriginalList.flatMap(strList -> strList.stream());
flatStream.forEach(System.out::println);
/**
* Java流终
- Java流终端操作
// Stream reduce()示例:我们可以使用reduce()来使用关联累加函数对流的元素执行减少,并返回Optional
Stream<Integer> numbers = Stream.of(1, 2, 3, 4, 5);
Optional<Integer> intOptional = numbers.reduce((i, j) -> {
return i * j;
});
if (intOptional.isPresent())
System.out.println("Multiplication = " + intOptional.get()); // 120
// Stream count()示例:我们可以使用此终端操作来计算流中的项目数。
Stream<Integer> numbers1 = Stream.of(1, 2, 3, 4, 5);
System.out.println("Number of elements in stream=" + numbers1.count()); // 5
// Stream forEach()示例:这可用于迭代流。我们可以用它来代替迭代器
Stream<Integer> numbers2 = Stream.of(1, 2, 3, 4, 5);
numbers2.forEach(i -> System.out.print(i + ",")); // 1,2,3,4,5,
// Stream match()示例
Stream<Integer> numbers3 = Stream.of(1, 2, 3, 4, 5);
System.out.println("Stream contains 4? " + numbers3.anyMatch(i -> i == 4));// Stream
Stream<Integer> numbers4 = Stream.of(1, 2, 3, 4, 5);
System.out.println("Stream contains all elements less than 10? " + numbers4.allMatch(i -> i < 10));// Stream
// contains
Stream<Integer> numbers5 = Stream.of(1, 2, 3, 4, 5);
System.out.println("Stream doesn't contain 10? " + numbers5.noneMatch(i -> i == 10));// Stream
// doesn't
// Stream findFirst()示例:这是一个短路终端操作,让我们看看我们如何使用它来从以D开头的流中查找第一个字符串
Stream<String> names4 = Stream.of("Pankaj", "Amit", "David", "Lisa");
Optional<String> firstNameWithD = names4.filter(i -> i.startsWith("D")).findFirst();
if (firstNameWithD.isPresent()) {
System.out.println("First Name starting with D=" + firstNameWithD.get()); // David
}
后续会总结其它新特性