Java 8和Java 11的流API比较

发布于:2024-07-01 ⋅ 阅读:(12) ⋅ 点赞:(0)

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);