当前位置: 首页 > 面试题库 >

转换清单 到清单 (或任何扩展Number的类)

毕富
2023-03-14
问题内容

我想创建一个非常通用的实用程序方法,以获取任何Collection并将其转换为用户可选类的Collection,该类从Number扩展(Long,Double,Float,Integer等)

我想到了使用Google集合来转换集合并返回不可变列表的代码。

import java.util.List;

import com.google.common.base.Function;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
/**
     * Takes a {@code List<String>} and transforms it into a list of the
     * specified {@code clazz}.
     * 
     * @param <T>
     * @param stringValues
     *            the list of Strings to be used to create the list of the
     *            specified type
     * @param clazz
     *            must be a subclass of Number. Defines the type of the new List
     * @return
     */
    public static <T extends Number> List<T> toNumberList(List<String> stringValues, final Class<T> clazz) {
        List<T> ids = Lists.transform(stringValues, new Function<String, T>() {
            @SuppressWarnings("unchecked")
            @Override
            public T apply(String from) {
                T retVal = null;
                if (clazz.equals(Integer.class)) {
                    retVal = (T) Integer.valueOf(from);
                } else if (clazz.equals(Long.class)) {
                    retVal = (T) Long.valueOf(from);
                } else if (clazz.equals(Float.class)) {
                    retVal = (T) Float.valueOf(from);
                } else if (clazz.equals(Double.class)) {
                    retVal = (T) Double.valueOf(from);
                } else {
                    throw new RuntimeException(String.format("Type %s is not supported (yet)", clazz.getName()));
                }
                return retVal;
            }
        });
        return ImmutableList.copyOf(ids);
    }

可以这样使用:

// Convert List<String> to List<Long>
List<Long> ids = MiscUtils.toNumberList(productIds, Long.class);

是我的代码过度杀伤力,还是您将如何简化它,同时又使其足够通用?


问题答案:

我认为这段代码最重要的方面是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 extends Number>能够将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。似乎在很多情况下这都没有用。



 类似资料:
  • 问题内容: 我正在尝试使用简单的Chrome扩展程序,但是在为数组提供值时遇到了问题。 当我尝试将此扩展程序加载到Chrome中时,收到以下消息: 无法从“ C:\ Users \ foo \ Desktop \ Extensions \ bar”加载扩展名。 “ content_scripts”的值无效。 我看不到我的值是什么“无效”。我想做的是匹配每个URL,以便我的扩展程序可以操纵它所运行的

  • 每个VS Code扩展需要一个清单文件package.json,该文件位于扩展的根目录中。 字段 名称 是否必要 类型 说明 name 是 string 扩展的名称,该名称必须为小写且不能有空格。 version 是 string SemVer 兼容版本. publisher 是 string 发布人名字 engines 是 object 一个至少包含vscode键值对的对象,该键表示的是本扩展可

  • 问题内容: 我是Java的新手,我需要列出列表列表。我可以在python中做到这一点,因为列表的元素可以是列表,因此在嵌入式列表中将引用列表,并且将引用嵌入式列表的zeroeth元素。有什么简单的方法可以在Java中实现此行为? 问题答案: 所有其他答案在技术上都是正确的,但是恕我直言,如果您实施了粗略的列表列表,您将无法在正确的抽象级别上处理数据。例如,我很确定列表列表在您的业务领域中已经意味着

  • 问题内容: 解析后,我的文件“ s”包含 因此,我需要在attributeIDGet列表中的冒号之后获取所有数字。我知道有几种方法可以做到。但是有什么方法可以 直接转换为。 由于以下代码抱怨类型不匹配,因此我尝试执行Integer.parseInt,但我想这不适用于List。这是String。 问题答案: 不,您需要遍历数组

  • 问题内容: 运行代码 退货 因此,每次在列表列表中每次更新元组(列表)的第一个参数,但第二个参数list [0]却没有更新。有人可以解释这里发生的事情并提出解决方法吗?我想输出 问题答案: 列表是可变类型-为了创建副本(而不只是传递相同的列表),您需要明确地这样做: 但是,已经是Python内置的名称-最好不要将该名称用作变量。这是一个不用作变量名并复制的版本: 请注意,我演示了两种不同的方法来复

  • 问题内容: 我创建一个这样的列表列表: 然后,我想在第一个子列表中插入10,如下所示: 但是,出现以下错误: 线程“主”中的异常java.lang.IndexOutOfBoundsException:Index:0,Size:0 at java.util.ArrayList.rangeCheck(ArrayList.java:653)at java.util.ArrayList.get(Array