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();
}
}
上述代码的运行结果如下所示