Predicate 谓词对象
Java8起为Collection集合新增了一个removeIf(Predicate)方法,该方法将会批量删除符合filter条件的所有元素。该方法需要一个Predicate对象作为参数
removeIf(Predicate pre) 该方法将会批量删除符合条件的所有元素
1 | hashSet.removeIf(new Predicate<String>() { |
Predicate 简化集合操作
1 | public static void main(String[] args) { |
Steam 流式API
Java8新增了Stream、InStream、LongStream、DoubleStream等流式API,这些API代表多个支持串行和并行聚集操作的元素。
Java8为上面每个流式API提供了对应的Builder
Stream 通用接口 Stream.Builder
IntSteam 对应的int类型的流 IntStream.Builder
LongStream 对应的long类型的流 LongStream.Builder
DoubleStream 对应的double类型的流 DoubleStream.Builder
使用Stream步骤
1、使用Stream或XxxStream的builder()类方法创建该Stream对应的Builder
2、重复调用Builder的add()方法向该流中添加多个元素
3、Builder的build()获取对应的Stream
4、调用Stream的聚集方法(Stream提供了大量的聚集方法供用户调用 ) 每个Stream只能调用一次聚集方法,Stream调用聚集方法后流就会关闭,并且不可重用。
- 中间方法:中间操作允许流保持打开状态,并允许直接调用后续方法。
- 末端方法:末端方法是对流的最终操作。对某个流操作执行末端方法后,该流将被消耗,且不再可用。例如sum() count() average()等都是末端方法
- 有状态的方法:这种方法会给流增加一些新的属性。例如元素的唯一性、元素的最大数量、保证元素以排序的方式被处理等。
- 有状态的方法往往需要更大的性能开销
- 短路方法:短路方法可以尽早结束对流的操作,不必检查所有的元素
Stream API
中间方法
filter(Predicate predicate) 过滤Stream中所有不符合Predicate的元素(也就是说返回一个符合Predicate条件的流)
1 | IntStream.Builder builder = IntStream.builder(); |
mapToXxx(ToXxxFunction mapper): 使用ToXxxFunction对流中的元素执行一对一的转换。该方法返回一个新Stream中包含了ToXxxFunction转换生成的所有元素
1 | LongStream.Builder builder = LongStream.builder(); |
peek(Cosumer action) 依次对每个元素执行一些操作,返回的流与原有流包含相同的元素
distinct():该方法用于排序流中所有重复的元素(判断重复依据是equels())。返回由该流的不同元素组成的流
sorted()该方法用于排序流中的元素在后续的访问中处于有序状态。是有状态的方法
limit(long maxSize) 该方法用于保证对该流的后续访问中最大允许的访问的元素个数。是一个有状态的、短路的方法。
末端方法
forEach(Consumer action) 遍历流中所有元素,对每个元素执行action
toArray():将流中所有元素转换为一个数组
reduce():用于通过某种操作来合并流中的元素
min():返回流中所有元素的最小值
max():返回流中所有元素的最大值
count():返回流中所有元素的数量
1 | IntStream.Builder builder = IntStream.builder(); |
anyMatch(Predicate predicate) 判断流中是否至少包含一个元素符合predicate条件
1 | IntStream.Builder builder = IntStream.builder(); |
allMatch(Predicate predicate): 判断流中是否每个元素都符合predicate条件
1 | boolean allMatch = build.allMatch(new IntPredicate() { |
anyMatch(Predicate predicate):判断流中是否每个元素都符合Predicate条件
1 | boolean b = build.anyMatch(new IntPredicate() { |
noneMatch(Predicate predicate) 判断流中是否所有元素都不符合predicate条件
1 | boolean b = build.noneMatch(new IntPredicate() { |
findFirst() 返回流中的第一个元素
findAny() 返回流中的任意一个元素
1 | LongStream.Builder builder = LongStream.builder(); |
Stream操作集合
Java8使用流式API操作集合,Collection接口中提供了一个stream()默认方法,该方法可以返回该集合对应的流,接下来即可通过流式API来操作
通过Map获取 Map不能直接获取流,必须通过键的集合、键值对的集合获取Set的流
1 | Map<Integer,String> map = new HashMap<>(); |
通过引用类型的数组获取流
1 | Integer[] arr = {1,2,3,432,3,2,324,32}; |
通过基本类型的数组获取流
1 | int[] arr = {1,4,234,32,32,523,432}; |
通过零散的数据获取流
1 | Stream<Integer> intStream = Stream.of(1,3,2,43,24,325,43,324,325,24,2); |
常用方法
filter方法 过滤
1 | LinkedList<String> list = new LinkedList<>(); |
count方法_统计个数
1 | long zCount = list.stream() |
limit (long maxSize) 该方法用于保证对该流的后续访问中最大允许访问的元素个数,短路的有状态的方法
1 | list.stream() |
skip方法_跳过前几个
1 | list.stream() |
map方法_转换
1 | LinkedList<String> list = new LinkedList<>(); |
concat方法_组合
1 | List<String> list1 = new ArrayList<>(); |
distinct() 用于排除流中所有重复的元素,去重使用,有状态的方法
1 | LinkedList<String> linkedList = new LinkedList<>(); |
sorted() 排序方法
1 | LinkedList<Integer> integers = new LinkedList<>(); |
min() 返回流中所有元素的最小值
1 | LinkedList<Integer> integers = new LinkedList<>(); |
max()返回流中所有元素的最大值
1 | Integer minInt = integers.stream().max(new Comparator<Integer>() { |
anyMatch(Predicate pre) 判断流中是否至少包含一个元素符合Predicate条件,返回true代表有元素包含,返回false代表没有元素包含
1 | LinkedList<Integer> list = new LinkedList<>(); |
allMatch(Predicate predicate) 判断流中是否每个元素都符合条件
1 | LinkedList<Integer> list = new LinkedList<>(); |
noneMatch(Predicate predicate) 判断流中是否所有元素都不符合Predicate条件
1 | LinkedList<Integer> integers = new LinkedList<>(); |
findFirst() 返回流中的第一个元素
1 | LinkedList<Integer> integers = new LinkedList<>(); |
findAny() 返回流中的任意一个元素
1 | LinkedList<Integer> list = new LinkedList<>(); |
Stream流的结果收集到集合和数组中
1 | collect(Collectors.toList()) 将流的结果转化为list |