当前位置:Java -> 在Java中探索TakeWhile和DropWhile函数

在Java中探索TakeWhile和DropWhile函数

TakeWhile

Java Stream API上,‘takeWhile’方法用于根据指定条件从流中提取元素。'takeWhile'特别适用于当我们希望从流的开头限制取出元素直到某个条件变为false的情况。

签名: Stream<T> takeWhile(Predicate<? super T> predicate)

示例

List<Integer> numbers = List.of(1,2,3,4,5,6,7,8);
numbers.stream()
        .takeWhile(x -> x < 5)
        .forEach(System.out :: println); # 1234


DropWhile

dropWhile’正好是‘takeWhile’方法的相反,‘dropWhile’方法在删除满足给定谓词的最长元素前缀后返回由流中剩余元素组成的流。

签名Stream<T> dropWhile(Predicate<? super T> predicate)

示例

private static void dropWhileDemo(){
    List<Integer> numbers = List.of(1,2,3,4,5,6,7,8);
    numbers.stream()
            .dropWhile(x -> x < 5)
            .forEach(System.out :: print);
}
#5678


何时使用它们:

TakeWhile: 

当您希望从流的开头提取元素直到某个条件不满足时,请使用'takeWhile'。用于创建满足特定条件的元素子集。

DropWhile: 

当您希望从流的开头跳过元素直到某个条件变为false时,请使用'dropWhile'。在基于条件要排除元素前缀时非常有用。

传统For循环和‘takeWhile’示例

假设我们有一个整数列表,您想使用传统for循环找到并打印出满足某个条件为止的所有元素。

List<Integer> numbers = List.of(1, 2, 3, 4, 5, 6, 7, 8);
int condition = 5;

for (int number : numbers) {
    if (number < condition) {
        System.out.print(number);
    } else {
        break;
    }
}


让我们使用‘takeWhile’方法实现相同的结果。

List<Integer> numbers = List.of(1, 2, 3, 4, 5, 6, 7, 8);
int condition = 5;
numbers.stream()
        .takeWhile(num -> num < condition)
        .forEach(System.out :: print);


传统For循环和‘dropWhile’示例

List<Integer> numbers = List.of(1, 2, 3, 4, 5, 6, 7, 8);
int condition = 5;
for (int number : numbers) {
    if (number > condition) {
        System.out.print(number);
    }
    continue;
}


让我们使用‘dropWhile’方法实现相同的结果。

numbers.stream()
        .dropWhile(x -> x <= condition)
        .forEach(System.out :: print);


关键要点

  • 两种方法一旦断言条件不再满足就停止处理。这可以提高效率,特别是对于大型集合或无限流。
  • 如果第一个元素已经不满足断言,takeWhile返回一个空集合。如果所有元素满足断言,dropWhile返回一个空集合。
  • 结果集合中的元素顺序与原始集合保持一致。
  • 我们可以将‘takeWhile’和‘dropWhile’函数与‘limit’函数结合使用,以进一步控制处理的元素数量。 takeWhile和limit: 假设我们有一个数字列表,提取直到满足某个条件,并将结果限制为特定数量。 dropWhile和limit: 跳过数字直到满足某个条件,并将结果限制为特定数量。
List<Integer> numbers = List.of(1,2,3,4,5,6,7,8,9);
List<Integer> takeWhileAndLimit = numbers.stream()
        .takeWhile(x -> x < 6)  
        .limit(3)               
        .collect(Collectors.toList());

System.out.println("TakeWhile and Limit: " + takeWhileAndLimit);

// Using dropWhile and limit
List<Integer> dropWhileAndLimit = numbers.stream()
        .dropWhile(x -> x < 6)  
        .limit(3)               
        .collect(Collectors.toList());

System.out.println("DropWhile and Limit: " + dropWhileAndLimit);

# TakeWhile and Limit: [1, 2, 3]
# DropWhile and Limit: [6, 7, 8]


Both ‘takeWhile’和‘dropWhile’的常见用例

- 数据过滤和转换

- 高效处理大型或潜在无限流

- 解析和验证

- 领域特定用例,例如获取数据库记录直到满足条件为止。

‘takeWhile’和‘dropWhile’的主要优势

  • 简洁和易读: 用‘takeWhile’和‘dropWhile’替换传统循环可简化代码并提高可读性。侧重于过滤的意图而不是循环机制。
  • 函数式编程风格: 符合函数式编程原则,强调不可变集合和纯函数,同时在处理集合时提高代码可组合性和重用性。
  • 效率: 两种方法一旦断言条件不再满足就停止处理。

推荐阅读: 14.线程的sleep()方法和yield()方法有什么不同?

本文链接: 在Java中探索TakeWhile和DropWhile函数