Java 8 Collectors 类的静态工厂方法

  摘自<<Java 8 实战>>

Collectors 类的静态工厂方法
工厂方法返回类型用于
toListList<T> 把流中所有项目收集到一个 List
使用示例: List<Dish> dishes = menuStream.collect(toList());
toSetSet<T>把流中所有项目收集到一个 Set ,删除重复项
使用示例: Set<Dish> dishes = menuStream.collect(toSet());
toCollectionCollection<T>把流中所有项目收集到给定的供应源创建的集合

使用示例: Collection<Dish> dishes = menuStream.collect(toCollection(),ArrayList::new);

countingLong计算流中元素的个数
使用示例: long howManyDishes = menuStream.collect(counting());
summingIntInteger对流中项目的一个整数属性求和

使用示例: int totalCalories = menuStream.collect(summingInt(Dish::getCalories));

averagingIntDouble计算流中项目 Integer 属性的平均值

使用示例: double avgCalories = menuStream.collect(averagingInt(Dish::getCalories));

summarizingIntIntSummaryStatistics

收集关于流中项目 Integer 属性的统计值,例如最大、最小、总和与平均值

使用示例: IntSummaryStatistics menuStatistics = menuStream.collect(summarizingInt(Dish::getCalories));

joiningString连接对流中每个项目调用 toString 方法所生成的字符串

使用示例: String shortMenu = menuStream.map(Dish::getName).collect(joining(","));

maxByOptional<T>

一个包裹了流中按照给定比较器选出的最大元素的 Optional,或如果流为空则为 Optional.empty()

使用示例: Optional<Dish> fattest = menuStream.collect(maxBy(comparingInt(Dish::getCalories)));

minByOptional<T>

一个包裹了流中按照给定比较器选出的最小元素的 Optional,或如果流为空则为 Optional.empty()

使用示例: Optional<Dish> lightest = menuStream.collect(minBy(comparingInt(Dish::getCalories)));

reducing归约操作产生的类型

从一个作为累加器的初始值开始,利用 BinaryOperator 与流中的元素逐个结合,从而将流归约为单个值

使用示例: int totalCalories = menuStream.collect(reducing(0, Dish::getCalories, Integer::sum));

collectingAndThen转换函数返回的类型包裹另一个收集器,对其结果应用转换函数

使用示例: int howManyDishes = menuStream.collect(collectingAndThen(toList(), List::size));

groupingByMap<K, List<T>>

根据项目的一个属性的值对流中的项目作问组,并将属性值作为结果 Map 的键

使用示例: Map<Dish.Type,List<Dish>> dishesByType = menuStream.collect(groupingBy(Dish::getType));

partitioningByMap<Boolean,List<T>>根据对流中每个项目应用谓词的结果来对项目进行分区

使用示例: Map<Boolean,List<Dish>> vegetarianDishes = menuStream.collect(partitioningBy(Dish::isVegetarian));

   

转载于:https://www.cnblogs.com/Java-Script/p/11133696.html

<think>好的,用户想了解Java接口中静态方法的作用和使用场景。首先,我需要回忆Java接口的发展,特别是从Java 8开始允许静态方法和默认方法的引入。静态方法在接口中的存在,主要是为了提供工具方法和工厂方法,这样可以将相关功能组织在接口内部,而不是放在单独的工具中,比如常见的Collections中的方法。 接下来,我需要确定静态方法的具体作用。根据引用中的资料,静态方法可以用于提供公共工具方法,例如参数校验或者数学计算,这样所有实现都可以直接调用,无需创建实例。另外,工厂方法模式也是一个典型应用,比如通过静态方法创建不同的实现实例,隐藏具体实现细节。此外,私有静态方法可以辅助默认方法,提高代码复用性,同时保持接口的简洁性。 然后,使用场景方面,用户可能需要知道何时使用接口中的静态方法。例如,当多个实现需要共享某个方法,但该方法不需要访问实例状态时,静态方法就很合适。另外,工具方法的整合也是一个场景,避免额外的工具,比如在接口中直接提供排序或校验方法。工厂方法创建对象也是一个常见场景,比如日志工厂生成不同的日志实现。 同时,需要注意静态方法的限制,比如只能通过接口名调用,不能被子覆盖,也不能访问实例变量。这些限制会影响它们的使用方式。结合引用中的内容,比如引用3提到Java 9后接口可以有私有静态方法,引用5说明静态方法不依赖对象实例,这些都需要在回答中提及。 最后,要确保回答结构清晰,分点说明作用和场景,并引用提供的资料来支持观点。可能还需要生成相关问题,比如与默认方法的区别、如何设计工具接口等,帮助用户进一步学习。</think>### Java接口中静态方法的作用与使用场景 #### 一、静态方法的核心作用 1. **提供公共工具方法** 接口中的静态方法常用于封装与接口功能相关的通用工具方法,例如参数校验、数学计算等。例如: ```java public interface MathUtils { static int square(int x) { return x * x; } } ``` 所有实现可直接通过`MathUtils.square(3)`调用[^3][^5]。 2. **实现工厂方法模式** 通过静态方法创建接口的实现实例,隐藏具体实现: ```java public interface Logger { static Logger createFileLogger() { return new FileLogger(); // 返回具体实现 } } ``` 3. **辅助默认方法** Java 9+允许使用私有静态方法,可辅助默认方法的实现: ```java public interface DataParser { default void parseData(String input) { validate(input); // 解析逻辑 } private static void validate(String input) { if (input == null) throw new IllegalArgumentException(); } } ``` #### 二、典型使用场景 1. **工具整合** 替代传统`XxxUtils`工具,例如集合操作接口: ```java public interface CollectionHelpers { static <T> List<T> filter(List<T> list, Predicate<T> predicate) { return list.stream().filter(predicate).collect(Collectors.toList()); } } ``` 2. **工厂模式实现** 创建接口实现的标准化方式: ```java public interface Shape { static Shape createCircle(double radius) { return new Circle(radius); } } ``` 3. **参数校验与预处理** 集中处理公共校验逻辑: ```java public interface Validator { static void checkEmailFormat(String email) { if (!email.contains("@")) throw new ValidationException(); } } ``` #### 三、特性与限制 1. **调用方式** - 只能通过接口名调用:`InterfaceName.staticMethod()` - 不能通过实现实例调用 2. **设计优势** - 增强接口内聚性 - 减少工具的数量 - 支持更灵活的模式实现(工厂模式、策略模式等) 3. **注意事项** - 不能被子覆盖 - 不能访问实例变量 - Java 8+支持公有静态方法Java 9+支持私有静态方法[^3][^4] #### 四、与默认方法的对比 | 特性 | 静态方法 | 默认方法 | |--------------|------------------------------|---------------------------| | 调用方式 | `接口名.方法名()` | `实例.方法名()` | | 访问权限 | 不能访问实例变量 | 可以访问其他接口方法 | | 主要用途 | 工具方法/工厂方法 | 提供默认实现 | | 重写可能性 | 不可被实现重写 | 可被实现重写 | [^1]: 接口应用场景的扩展性设计 [^3]: Java 9接口方法型演进 : 静态方法级别特性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值