教程 > java8 教程 > 阅读:30

java8 流 stream——迹忆客-ag捕鱼王app官网

stream 是 java 8 中引入的一个新的抽象层。使用 stream,我们可以用类似于 sql 语句的声明方式处理数据。 例如,考虑以下 sql 语句。

select max(salary), employee_id, employee_name from employee

上面的 sql 表达式会自动返回最高工资员工的详细信息,而无需在开发人员端进行任何计算。 使用 java 中的集合框架,开发人员必须使用循环并进行重复检查。 另一个问题是效率。 由于多核处理器可以轻松使用,java 开发人员必须编写可能非常容易出错的并行代码处理。

为了解决这些问题,java 8 引入了流的概念,允许开发人员以声明方式处理数据并利用多核架构,而无需为其编写任何特定代码。


什么是 stream 流

stream 表示来自源的一系列对象,它支持聚合操作。以下是流的特征

  • 元素序列 - 流以顺序方式提供一组特定类型的元素。流按需获取/计算元素。它从不存储元素。
  • source - stream 将集合、数组或 i/o 资源作为输入源。
  • 聚合操作 - stream 支持聚合操作,如过滤、映射、限制、减少、查找、匹配等。
  • pipelining - 大多数流操作返回流本身,以便它们的结果可以流水线化。这些操作称为中间操作,它们的功能是获取输入、处理它们并将输出返回给目标。 collect() 方法是一个终端操作,通常出现在流水线操作结束时,以标记流的结束。
  • 自动迭代 - 流操作在内部对提供的源元素进行迭代,与需要显式迭代的集合相反。

生成流

在 java 8 中,collection 接口有两种方法来生成 stream。

  • stream() - 返回将集合视为其源的顺序流。
  • parallelstream() - 返回一个并行流,将集合作为其源。
list strings = arrays.aslist("abc", "", "bc", "efg", "abcd","", "jkl");
list filtered = strings.stream().filter(string -> !string.isempty()).collect(collectors.tolist());

foreach

stream 提供了一种新方法“foreach”来迭代流的每个元素。 以下代码段显示了如何使用 foreach 打印 10 个随机数。

random random = new random();
random.ints().limit(10).foreach(system.out::println);

map

“map”方法用于将每个元素映射到其对应的结果。 以下代码段使用 map 打印唯一的数字平方。

list numbers = arrays.aslist(3, 2, 2, 3, 7, 3, 5);
//get list of unique squares
list squareslist = numbers.stream().map( i -> i*i).distinct().collect(collectors.tolist());

filter

“filter” 方法用于根据标准消除元素。 以下代码段使用过滤器打印空字符串的计数。

liststrings = arrays.aslist("abc", "", "bc", "efg", "abcd","", "jkl");
//get count of empty string
int count = strings.stream().filter(string -> string.isempty()).count();

limit

“limit”方法用于减小流的大小。 以下代码段显示了如何使用 limit 打印 10 个随机数。

random random = new random();
random.ints().limit(10).foreach(system.out::println);

sorted

“sorted”方法用于对流进行排序。 以下代码段显示了如何按排序顺序打印 10 个随机数。

random random = new random();
random.ints().limit(10).sorted().foreach(system.out::println);

并行处理

parallelstream 是用于并行处理的流的替代方案。 看看下面的代码段,它使用 parallelstream 打印空字符串的计数。

list strings = arrays.aslist("abc", "", "bc", "efg", "abcd","", "jkl");
//get count of empty string
long count = strings.parallelstream().filter(string -> string.isempty()).count();

在顺序流和并行流之间切换非常容易。


collectors

collectors 用于组合对流元素的处理结果。 collectors 可用于返回列表或字符串。

liststrings = arrays.aslist("abc", "", "bc", "efg", "abcd","", "jkl");
list filtered = strings.stream().filter(string -> !string.isempty()).collect(collectors.tolist());
system.out.println("filtered list: "   filtered);
string mergedstring = strings.stream().filter(string -> !string.isempty()).collect(collectors.joining(", "));
system.out.println("merged string: "   mergedstring);

statistics

在 java 8 中,引入了统计收集器来在流处理完成时计算所有统计信息。

list numbers = arrays.aslist(3, 2, 2, 3, 7, 3, 5);
intsummarystatistics stats = numbers.stream().maptoint((x) -> x).summarystatistics();
system.out.println("highest number in list : "   stats.getmax());
system.out.println("lowest number in list : "   stats.getmin());
system.out.println("sum of all numbers : "   stats.getsum());
system.out.println("average of all numbers : "   stats.getaverage());

stream 流 示例

下面是一个完整的流的示例

import java.util.arraylist;
import java.util.arrays;
import java.util.intsummarystatistics;
import java.util.list;
import java.util.random;
import java.util.stream.collectors;
import java.util.map;
public class java8tester {
   public static void main(string args[]) {
      system.out.println("using java 7: ");
        
      // count empty strings
      list strings = arrays.aslist("abc", "", "bc", "efg", "abcd","", "jkl");
      system.out.println("list: "  strings);
      long count = getcountemptystringusingjava7(strings);
        
      system.out.println("empty strings: "   count);
      count = getcountlength3usingjava7(strings);
        
      system.out.println("strings of length 3: "   count);
        
      //eliminate empty string
      list filtered = deleteemptystringsusingjava7(strings);
      system.out.println("filtered list: "   filtered);
        
      //eliminate empty string and join using comma.
      string mergedstring = getmergedstringusingjava7(strings,", ");
      system.out.println("merged string: "   mergedstring);
      list numbers = arrays.aslist(3, 2, 2, 3, 7, 3, 5);
        
      //get list of square of distinct numbers
      list squareslist = getsquares(numbers);
      system.out.println("squares list: "   squareslist);
      list integers = arrays.aslist(1,2,13,4,15,6,17,8,19);
        
      system.out.println("list: "  integers);
      system.out.println("highest number in list : "   getmax(integers));
      system.out.println("lowest number in list : "   getmin(integers));
      system.out.println("sum of all numbers : "   getsum(integers));
      system.out.println("average of all numbers : "   getaverage(integers));
      system.out.println("random numbers: ");
        
      //print ten random numbers
      random random = new random();
        
      for(int i = 0; i < 10; i  ) {
         system.out.println(random.nextint());
      }
        
      system.out.println("using java 8: ");
      system.out.println("list: "  strings);
        
      count = strings.stream().filter(string->string.isempty()).count();
      system.out.println("empty strings: "   count);
        
      count = strings.stream().filter(string -> string.length() == 3).count();
      system.out.println("strings of length 3: "   count);
        
      filtered = strings.stream().filter(string ->!string.isempty()).collect(collectors.tolist());
      system.out.println("filtered list: "   filtered);
        
      mergedstring = strings.stream().filter(string ->!string.isempty()).collect(collectors.joining(", "));
      system.out.println("merged string: "   mergedstring);
        
      squareslist = numbers.stream().map( i ->i*i).distinct().collect(collectors.tolist());
      system.out.println("squares list: "   squareslist);
      system.out.println("list: "  integers);
        
      intsummarystatistics stats = integers.stream().maptoint((x) ->x).summarystatistics();
        
      system.out.println("highest number in list : "   stats.getmax());
      system.out.println("lowest number in list : "   stats.getmin());
      system.out.println("sum of all numbers : "   stats.getsum());
      system.out.println("average of all numbers : "   stats.getaverage());
      system.out.println("random numbers: ");
        
      random.ints().limit(10).sorted().foreach(system.out::println);
        
      //parallel processing
      count = strings.parallelstream().filter(string -> string.isempty()).count();
      system.out.println("empty strings: "   count);
   }
    
   private static int getcountemptystringusingjava7(list strings) {
      int count = 0;
      for(string string: strings) {
        
         if(string.isempty()) {
            count  ;
         }
      }
      return count;
   }
    
   private static int getcountlength3usingjava7(list strings) {
      int count = 0;
        
      for(string string: strings) {
        
         if(string.length() == 3) {
            count  ;
         }
      }
      return count;
   }
    
   private static list deleteemptystringsusingjava7(list strings) {
      list filteredlist = new arraylist();
        
      for(string string: strings) {
        
         if(!string.isempty()) {
             filteredlist.add(string);
         }
      }
      return filteredlist;
   }
    
   private static string getmergedstringusingjava7(list strings, string separator) {
      stringbuilder stringbuilder = new stringbuilder();
        
      for(string string: strings) {
        
         if(!string.isempty()) {
            stringbuilder.append(string);
            stringbuilder.append(separator);
         }
      }
      string mergedstring = stringbuilder.tostring();
      return mergedstring.substring(0, mergedstring.length()-2);
   }
    
   private static list getsquares(list numbers) {
      list squareslist = new arraylist();
        
      for(integer number: numbers) {
         integer square = new integer(number.intvalue() * number.intvalue());
            
         if(!squareslist.contains(square)) {
            squareslist.add(square);
         }
      }
      return squareslist;
   }
    
   private static int getmax(list numbers) {
      int max = numbers.get(0);
        
      for(int i = 1;i < numbers.size();i  ) {
        
         integer number = numbers.get(i);
            
         if(number.intvalue() > max) {
            max = number.intvalue();
         }
      }
      return max;
   }
    
   private static int getmin(list numbers) {
      int min = numbers.get(0);
        
      for(int i= 1;i < numbers.size();i  ) {
         integer number = numbers.get(i);
        
         if(number.intvalue() < min) {
            min = number.intvalue();
         }
      }
      return min;
   }
    
   private static int getsum(list numbers) {
      int sum = (int)(numbers.get(0));
        
      for(int i = 1;i < numbers.size();i  ) {
         sum  = (int)numbers.get(i);
      }
      return sum;
   }
    
   private static int getaverage(list numbers) {
      return getsum(numbers) / numbers.size();
   }
}

上述代码的运行结果如下所示

java8 流

查看笔记

扫码一下
查看教程更方便
网站地图