I. Java 8的流API特性:
一、创建流
- 从集合创建流
List<String> names = Arrays.asList("John", "Martin", "Adam", "Nancy"); Stream<String> namesStream = names.stream();
- 从数组创建流
Integer[] numbers = {1, 2, 3, 4, 5}; Stream<Integer> numbersStream = Arrays.stream(numbers);
- 从值序列创建流
Stream<String> namesStream = Stream.of("John", "Martin", "Adam", "Nancy");
二、中间操作
- 过滤操作
List<String> names = Arrays.asList("John", "Martin", "Adam", "Nancy"); List<String> longNames = names.stream() .filter(name -> name.length() > 4) .collect(Collectors.toList());
- 映射操作
List<String> names = Arrays.asList("John", "Martin", "Adam", "Nancy"); List<String> upperCaseNames = names.stream() .map(String::toUpperCase) .collect(Collectors.toList());
- 排序操作
List<String> names = Arrays.asList("John", "Martin", "Adam", "Nancy"); List<String> sortedNames = names.stream() .sorted() .collect(Collectors.toList());
三、末端操作
- ToList:将流元素收集到列表中
List<String> names = Arrays.asList("John", "Martin", "Adam", "Nancy"); List<String> namesInUpperCase = names.stream() .map(String::toUpperCase) .collect(Collectors.toList());
- Count:计算流中元素的数量
List<String> names = Arrays.asList("John", "Martin", "Adam", "Nancy"); long count = names.stream() .filter(name -> name.startsWith("A")) .count();
- Reduce:将流元素组合成一个元素
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); int sum = numbers.stream() .reduce(0, Integer::sum);
四、顺序与并行流
- 顺序流
List<String> names = Arrays.asList("John", "Martin", "Adam", "Nancy"); names.stream() .filter(name -> name.startsWith("A")) .forEach(System.out::println);
- 并行流
List<String> names = Arrays.asList("John", "Martin", "Adam", "Nancy"); names.parallelStream() .filter(name -> name.startsWith("A")) .forEach(System.out::println);
五、创建和使用无限流
Stream<Integer> infiniteStream = Stream.iterate(0, i -> i + 1); List<Integer> collected = infiniteStream .limit(10) .collect(Collectors.toList());
II. Java 11的流API扩展和改进:
一、对null的处理:
Java 11引入Optional类的新方法
isEmpty
,可以更方便的对null进行处理。例如,以下是在处理流时如何使用:
Optional<String> optional = Optional.empty(); if(optional.isEmpty()){ System.out.println("Value is not available."); }
这样就消除了用
!optional.isPresent()
的绕口的替代方法。二、改进的性能:
在Java 11中,在某些场景下使用流或者并行流可能获得更好的性能。具体的性能改进取决于具体的使用场景和硬件配置。你可以通过JMH(Java Microbenchmark Harness)来为你的应用进行微基准测试,以便了解应用在实际场景下的性能。
三、新API:
- strip()
这个方法可以从字符串的开头和结尾去除空白。这个方法比trim()更智能,能够处理Unicode空白字符。与流一起使用的例子如下:
List<String> list = Arrays.asList(" john ", " martin ", " nancy "); list.stream() .map(String::strip) .forEach(System.out::println);
- isBlank()
这个方法检查字符串是否为空或者只包含空白。与流一起使用的例子如下:
List<String> list = Arrays.asList(" ", " martin ", " "); list.stream() .filter(String::isBlank) .forEach(System.out::println);
- lines()
这个方法返回一个由原字符串按行分割后的元素组成的流。与流一起使用的例子如下:
String multilineStr = "line1\nline2\nline3"; multilineStr.lines() .forEach(System.out::println);