Stream流的一些常用方法

在 Java 中,Stream 是 Java 8 引入的一个新的抽象概念,用于对集合(如 ListSet 等)进行高效的操作,如过滤、映射、排序等。Stream 提供了许多常用方法,可分为中间操作和终端操作,下面为你详细介绍。

中间操作

中间操作会返回一个新的流,并且不会立即执行,只有在终端操作被调用时才会执行。

1. filter

用于过滤流中的元素,只保留满足指定条件的元素。

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class FilterExample {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
        List<Integer> evenNumbers = numbers.stream()
               .filter(n -> n % 2 == 0)
               .collect(Collectors.toList());
        System.out.println(evenNumbers); 
    }
}

上述代码使用 filter 方法过滤出列表中的偶数。

2. map

将流中的每个元素通过一个指定的函数进行转换,返回一个包含转换后元素的新流。

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class MapExample {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 3);
        List<Integer> squaredNumbers = numbers.stream()
               .map(n -> n * n)
               .collect(Collectors.toList());
        System.out.println(squaredNumbers); 
    }
}

这里使用 map 方法将列表中的每个元素平方。

3. flatMap

将流中的每个元素转换为另一个流,然后将所有流合并成一个流。

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class FlatMapExample {
    public static void main(String[] args) {
        List<List<Integer>> nestedList = Arrays.asList(
                Arrays.asList(1, 2),
                Arrays.asList(3, 4)
        );
        List<Integer> flattenedList = nestedList.stream()
               .flatMap(List::stream)
               .collect(Collectors.toList());
        System.out.println(flattenedList); 
    }
}

此代码使用 flatMap 方法将嵌套列表扁平化。

4. distinct

去除流中的重复元素。

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class DistinctExample {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 2, 3, 3, 3);
        List<Integer> distinctNumbers = numbers.stream()
               .distinct()
               .collect(Collectors.toList());
        System.out.println(distinctNumbers); 
    }
}

distinct 方法确保结果列表中没有重复元素。

5. sorted

对流中的元素进行排序。

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class SortedExample {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(3, 1, 2);
        List<Integer> sortedNumbers = numbers.stream()
               .sorted()
               .collect(Collectors.toList());
        System.out.println(sortedNumbers); 
    }
}

上述代码对列表中的元素进行自然排序。

终端操作

终端操作会触发流的执行,并产生一个最终结果。

1. forEach

对流中的每个元素执行指定的操作。

import java.util.Arrays;
import java.util.List;

public class ForEachExample {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 3);
        numbers.stream()
               .forEach(System.out::println);
    }
}

此代码使用 forEach 方法打印列表中的每个元素。

2. collect

将流中的元素收集到一个集合或其他数据结构中。

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class CollectExample {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 3);
        List<Integer> squaredNumbers = numbers.stream()
               .map(n -> n * n)
               .collect(Collectors.toList());
        System.out.println(squaredNumbers); 
    }
}

这里使用 collect 方法将转换后的元素收集到一个列表中。

3. reduce

将流中的元素进行归约操作,得到一个最终结果。

import java.util.Arrays;
import java.util.List;
import java.util.Optional;

public class ReduceExample {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 3);
        Optional<Integer> sum = numbers.stream()
               .reduce((a, b) -> a + b);
        sum.ifPresent(System.out::println); 
    }
}

上述代码使用 reduce 方法计算列表中元素的总和。

4. count

返回流中元素的数量。

import java.util.Arrays;
import java.util.List;

public class CountExample {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 3);
        long count = numbers.stream()
               .count();
        System.out.println(count); 
    }
}

count 方法返回列表中元素的个数。

5. anyMatchallMatchnoneMatch
  • anyMatch:判断流中是否至少有一个元素满足指定条件。
  • allMatch:判断流中是否所有元素都满足指定条件。
  • noneMatch:判断流中是否没有元素满足指定条件。
import java.util.Arrays;
import java.util.List;

public class MatchExample {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 3);
        boolean anyEven = numbers.stream()
               .anyMatch(n -> n % 2 == 0);
        boolean allPositive = numbers.stream()
               .allMatch(n -> n > 0);
        boolean noneNegative = numbers.stream()
               .noneMatch(n -> n < 0);
        System.out.println(anyEven); 
        System.out.println(allPositive); 
        System.out.println(noneNegative); 
    }
}

这些方法用于对列表中的元素进行条件判断。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值