您的位置:首页 > 编程语言 > Java开发

☕ Java 8 新增操作集合的方法

2022-04-11 22:21 537 查看

1.Predicate

Java 8 起为 Collection 集合新增了 一个

removeIf(Predicate filter)
方法。

传入 Predicate 对象参数

  • removeIf(Predicate filter)
    ,该方法将会批量删除符合 filter 条件的所有元素 。

    Predicate是函数式接口,因此可以Lambda表达式作为参数

    books.removeIf(elem -> ((String) elem).length() < 10); // 所有长度小于 10 的字符串元素都会被删除

实例:

//先定义了 一个 calAllO方法,该方法将会使用 Predicate 判断每个集合元素是否符合特定条件
public static int calAll(Collection books, Predicate p) {
int total = 0;
for (Object obj : books) {
// 使用 Predicate 的 test ()方法判断该对象是否满足 Predicate 指定的条件
if (p.test(obj))
total++;
}
return total;
}
// 统计书名中出现"实战" 字符串的图书数量 。
System.out.println(calAll(books, elem -> ((String) elem).contains("实战")));
// 统计书名中出现 "Java" 宇符串的图书数量。
System.out.println(calAll(books, elem -> ((String) elem).contains("Java")));
// 统计书名长度大于 10 的图书数量 。
System.out.println(calAll(books, elem -> ((String) elem).length() > 10));

2. Stream

Stream 是一个通用的流接口,而 IntStream、 LongStream、DoubleStream 则代表元素类型为 int、 long、 double 的流。

这些 API 代表多个支持串行和并行聚合操作的元素。

Java 8 为API提供了对应的 Builder (如,Stream.Builder、IntStream.Builder)来创建相应的流。

独立使用Stream的步骤:

  • 使用 Stream 的
    builder()
    类方法创建相应的 Builder
  • 重复调用 Builder 的
    add()
    方法往流中添加多个元素
  • 调用 Builder 的 【
    build()
    】方法获取对应的 Stream
  • 调用 Stream 的聚合方法
// step 1
IntStream ins = IntStream.builder()
.add(10)  // step2
.add(2)
.add(-4)
.build(); // step3

// step 4
//  System.out.println("ins中最大值:" + ins.max().getAsInt());
//  System.out.println("ins中最小值:" + ins.min().getAsInt());
//  System.out.println("ins中元素总和:" + ins.sum());
//  System.out.println("ins中元素总数:" + ins.count());
//  System.out.println("ins中元素平均值:" + ins.average().getAsDouble());
//  System.out.println("ins中所有元素的平方是否大于20: " + ins.allMatch(elem -> elem * elem > 20));
//  System.out.println("ins中是否包含任何元素的平方大于20:" + ins.anyMatch(elem -> elem * elem > 20));
//  将 is 映射成一个新 Stream ,新 Stream 的每个元素是原 Stream 元素的 2 倍 +1
IntStream newIns = ins.map(elem -> elem * 2 + 1);

每个Stream只能执行一次, 其余代码需要注释掉。

用流操作集合

// 统计书名中出现"疯狂" 字符串的图书数量 。
System.out.println(books.stream().filter(
elem -> ((String) elem).contains("疯狂")).count());
// 统计书名中出现 "Java" 宇符串的图书数量。
System.out.println(books.stream().filter(
elem -> ((String) elem).contains("Java")).count());
// 统计书名长度大于 10 的图书数量 。
System.out.println(books.stream().filter(
elem->((String) elem).length() > 10).count());

//先调用 Co11ection 对象的 stream ()方法将集合转换为 Stream
//再调用 St ream 的 mapToInt ()方法获取原有的 Stream 对应的 IntStream
books.stream().mapToInt(elem->((String)elem).length())
.forEach(System.out::println);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: