我认为这段代码最重要的方面是
Function方法本身。我也认为切换
Function主体中允许的子类没有任何意义,因为您已经知道
Number要在
Function创建子类时返回哪种类型的子类。如果给出的话,您的方法也会失败,这也是一个小问题
BigInteger.class。
鉴于此,我要做的是创建一个实用工具类(我们称之为它
Numbers),并在其上提供方法,使每个方法返回一个
Function(可以是
enum单例)将a解析
String为特定类型的方法
Number。那是:
public class Numbers { public static Function<String, Integer> parseIntegerFunction() { ... } public static Function<String, Long> parseLongFunction() { ... } ...}
它们每个都可以这样实现:
public static Function<String, Integer> parseIntegerFunction() { return ParseIntegerFunction.INSTANCE;}private enum ParseIntegerFunction implements Function<String, Integer> { INSTANCE; public Integer apply(String input) { return Integer.valueOf(input); } @Override public String toString() { return "ParseIntegerFunction"; }}
然后可以使用此功能,但用户需要:
List<String> strings = ...List<Integer> integers = Lists.transform(strings, Numbers.parseIntegerFunction());
与您的方法相比,此方法有很多优点:
- 不需要任何切换
Function
。。。我们知道我们要创建哪种类型的号码,只需执行此 *** 作即可。快点。 - 更加灵活,因为每个都
Function
可以在任何地方使用…用户不必像您的方法那样使用它(将转换后的值复制到中ImmutableList
。 - 您仅创建
Function
您实际要允许的。如果没有BigInteger
解析功能,则用户只能调用它,而不是像在您的示例中那样在编译时完全合法然后在运行时失败是完全合法的。
附带说明一下,我建议将返回
ImmutableListbe
ImmutableList而不是
List…
的任何方法的返回类型设为…,它提供对该方法的客户有用的信息。
编辑:
如果您 确实需要 更多动态的东西(即,您希望具有某些实例的类
Class<T extendsNumber>能够将
Strings转换为该
Number类型),则还可以添加如下查找方法:
public static <T extends Number> Function<String, T> parseFunctionFor(Class<T> type) { // lookup the function for the type in an ImmutableMap and return it}
但是,如果有一个
Number子类没有提供,则它与原始方法有同样的问题
Function。似乎在很多情况下这都没有用。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)