本文目录
学习目标
stream api主要提供了两种类型的操作:中间操作 和 终止操作。
中间操作
filter(过滤)
- filter()方法接受一个谓词(一个返回boolean值的函数),并返回一个流,其中仅包含通过该谓词的元素。
建一个数组,帅选出长度大于4的元素
eg:
public class main {
public static void main(string[] args) {
list<string> names = arrays.aslist("alex", "brian", "charles", "david");
list<string> collect = names.stream().filter(item -> item.length() > 4).collect(collectors.tolist());
system.out.println(collect);
}
}
map(转换)
- map()方法可将一个流的元素转换为另一个流。它接受一个函数,该函数映射流中的每个元素到另一个元素。
public class main {
public static void main(string[] args) {
list<integer> numbers = arrays.aslist(1, 2, 3, 4, 5);
list<integer> collect = numbers.stream().map(n ->
{
n = n * 2;
return n;
}).collect(collectors.tolist());
for (integer integer : collect) {
system.out.println("integer = " + integer);
}
}
}
首先创建了一个包含数字 1~5 的列表。
然后利用 stream() 方法将列表转换成 stream 对象。
接下来调用 map() 方法对每个元素进行操作,这里使用了 lambda 表达式对每个元素进行了乘以 2 的操作。
最后调用 collect() 方法将结果收集起来,并转换成 list。
- 转换为map
public class main {
public static void main(string[] args) {
list<integer> numbers = arrays.aslist(1, 2, 3, 4, 5);
map<byte, integer> collect = numbers.stream().collect(collectors.tomap(integer::bytevalue, item -> item*2, (val1, val2) -> val2));
for (map.entry<byte, integer> byteintegerentry : collect.entryset()) {
byte key = byteintegerentry.getkey();
system.out.println("key = " + key);
system.out.println("value = " + byteintegerentry.getvalue());
}
}
}
sorted(排序)
- sorted()方法可对流进行排序。它可以接受一个comparator参数,也可以使用自然排序ordering.natural()。默认排序是按升序排序。
public class main {
public static void main(string[] args) {
int[] numbers = { 5, 2, 8, 3, 7 };
int[] sortednumbers = arrays.stream(numbers).sorted().toarray();
system.out.println(arrays.tostring(sortednumbers));
}
}
distinct(去重)
- distinct()方法从流中返回所有不同的元素。在内部,它使用equals()方法来比较元素是否相同。因此,我们需要确保equals()方法已正确实现。
public class main {
public static void main(string[] args) {
list<integer> numbers = arrays.aslist(1, 2, 3, 2, 1);
list<integer> collect = numbers.stream().distinct().collect(collectors.tolist());
system.out.println(collect);
}
}
limit(限制)
- limit()方法可以将流限制为指定的元素数。
public class main {
public static void main(string[] args) {
list<integer> numbers = arrays.aslist(1, 2, 3, 4, 5);
list<integer> collect = numbers.stream().limit(3).collect(collectors.tolist());
system.out.println(collect);
}
}
skip(跳过)
public class main {
public static void main(string[] args) {
list<integer> numbers = arrays.aslist(1, 2, 3, 4, 5);
list<integer> collect = numbers.stream().skip(2).collect(collectors.tolist());
system.out.println(collect);
}
}
- skip()方法可跳过前n个元素。
peek(展示)
- peek()方法可以用于在stream流中获取元素同时执行一些操作,如打印、调试、观察等。通常会与其他的方法联合使用。
public class main {
public static void main(string[] args) {
list<string> names = arrays.aslist("alex", "brian", "charles", "david");
list<string> filterednames = names.stream()
.peek(system.out::println)
.filter(name -> name.startswith("c"))
.peek(name -> system.out.println("filtered value: " + name))
.collect(collectors.tolist());
system.out.println("-----------------------------------------------------------------");
system.out.println(filterednames);
}
}
终止操作
foreach(循环)
- foreach()方法可将给定的方法应用于流中的每个元素。该方法是一种消费流的方式,不会返回值。
public class main {
public static void main(string[] args) {
list<string> names = arrays.aslist("alex", "brian", "charles", "david");
names.stream().foreach(system.out::println);
}
}
collect(收集)
- collect()方法可以将流中的元素收集到一个集合中。一般与其他方法配合使用。
public class main {
public static void main(string[] args) {
list<integer> numbers = arrays.aslist(1, 2, 3, 4, 5);
list<integer> evennumbers = numbers.stream().filter(n -> n % 2 == 0).collect(collectors.tolist());
system.out.println(evennumbers);
}
}
count(计数)
- count()方法可以返回流中的元素数。
public class main {
public static void main(string[] args) {
list<string> names = arrays.aslist("alex", "brian", "charles", "david");
long count = names.stream().count();
system.out.println(count);
}
}
reduce(聚合)
- reduce()方法可以将流元素聚合为单个结果。它接受一个binaryoperator参数作为累加器。
public class main {
public static void main(string[] args) {
list<integer> numbers = arrays.aslist(1, 2, 3, 4, 5);
optional<integer> sum = numbers.stream().reduce((a, b) -> a + b);
system.out.println(sum);
}
}
anymatch(任意匹配)
- anymatch()方法如果至少有一个元素与给定的谓词匹配,则返回true。
public class main {
public static void main(string[] args) {
list<string> names = arrays.aslist("alex", "brian", "charles", "david");
boolean anystartswithb = names.stream().anymatch(name -> name.startswith("b"));
system.out.println(anystartswithb);
}
}
allmatch(全部匹配)
- allmatch()方法如果所有元素都与给定谓词匹配,则返回true。
public class main {
public static void main(string[] args) {
list<string> names = arrays.aslist("alex", "brian", "charles", "david");
boolean allstartswithb = names.stream().allmatch(name -> name.startswith("b"));
system.out.println(allstartswithb);
}
}
nonematch(无匹配)
- nonematch()方法,如果没有任何元素与给定谓词匹配,则返回true。
public class main {
public static void main(string[] args) {
list<string> names = arrays.aslist("alex", "brian", "charles", "david");
boolean nonestartswithb = names.stream().nonematch(name -> name.startswith("e"));
system.out.println(nonestartswithb);
}
}
以上就是java stream流的基础知识和操作方式。stream api可以使java程序员编写出高效,干净,紧凑的代码,使得代码易于阅读和维护。建议初学者多加练习,掌握基本操作。中级和高级程序员则需要深入研究stream api的实现原理和运作机制,进一步提高代码的质量和效率。
使用stream流的优缺点:
优点:
缺点:
怎么用?
好书分享
618,清华社 it book 多得图书活动开始啦!活动时间为 2023 年 6 月 7 日至 6 月 18 日,清华
社为您精选多款高分好书,涵盖了 c++、java、python、前端、后端、数据库、算法与机器学习等多
个 it 开发领域,适合不同层次的读者。全场 5 折,扫码领券更有优惠哦!快来查看详情 !
图书链接:项目驱动零起点学java
发表评论