【问题标题】:Java 8 Comma Separated String to Object propertyJava 8 逗号分隔字符串到对象属性
【发布时间】:2023-04-09 20:54:01
【问题描述】:

我有三个逗号分隔的列表(公共汽车、汽车、自行车的列表),我正在尝试使用 Java 8 流将它们写入 Java 对象属性。

请在下面找到我尝试过的内容:

public class Traffic {

    public int car;
    public int bus;
    public int cycle;

    public Traffic(int car, int bus,int cycle){
        this.car = car;
        this.bus = bus;
        this.cycle = cycle;
    }

}

public class Test {

    public static void main(String[] args) {

        String bus = "5,9,15,86";
        String car = "6,12,18,51";
        String cycle = "81,200,576,894";
        String[] busArray = bus.split(",");
        String[] carArray = car.split(",");
        String[] cycleArray = cycle.split(",");

        List<Traffic> trafficList =
                Arrays.stream(values)
                        .mapToInt(Integer::parseInt)
                        .mapToObj((int i,j) -> new Traffic(i,j))
                        .collect(Collectors.toList());
    }

}

我一直在努力让所有流都启动并注入到对象属性中。 (在这种情况下,我想创建 4 个对象来填充所有 3 个属性。)

基本上,我正在寻找如下内容:

List<Traffic> trafficList =
                Arrays.stream(carArray,busArray,cycleArray)
                        .mapToInt(Integer::parseInt)
                        .mapToObj((int i,j,k) -> new Traffic(i,j,k))
                        .collect(Collectors.toList());

【问题讨论】:

  • 您是否期望得到Traffic 的4 个不同对象?
  • 感觉很糟糕回答一个错误的问题,然后其他人得到正确的答案,因为 OP 编辑​​了问题...:/

标签: java lambda java-8 java-stream


【解决方案1】:

如果您想创建 4 个交通对象,那么您可以使用以下内容:

List<Traffic> collect = IntStream.range(0, busArray.length)
                          .mapToObj(i -> new Traffic(Integer.parseInt(busArray[i]),
                                                     Integer.parseInt(carArray[i]),
                                                     Integer.parseInt(cycleArray[i])))
                          .collect(Collectors.toList());

【讨论】:

  • 如果carArray 的元素比busArray 少怎么办?你不关心IndexOutOfBoundsException。或者你可以明确写IntStream.range(0, 4)
【解决方案2】:

您只需拆分字符串,然后将每个值映射到您的对象。

这里我假设值可以通过Traffic 对象的构造函数传递。如果没有,您可以创建它并将其值设置在 2 个单独的行中。如果value 预期为整数,则mapToInt 是必需的。

String original = "5,9,15,86";
String[] values = original.split(",");

List<Traffic> trafficList = 
   Arrays.stream(values)
      .mapToInt(Integer::parseInt)
      .map(Traffic::new) 
      .collect(Collectors.toList());

【讨论】:

  • @JavaMan 你有没有注意到这个答案也有我之前遇到的错误?
【解决方案3】:

在类Traffic中定义一个构造函数,它接受一个整数作为参数并将它分配给类中的value属性。

    static class Traffic {
      private int value;
      public Traffic(int value) {
        this.value = value;
      }
    }

现在假设逗号分隔的字符串在字符串 commandList 中,如下所示。

String commaList = "1,3,5,6,7,8,9,100";

以下流指令将返回一个带有分配值的交通对象列表。

    List<Traffic> listOfIntegers = 
      Arrays.asList(commaList.split(","))
        .stream()
        .map(e -> new Traffic(Integer.valueOf(e)))
        .collect(Collectors.toList());

【讨论】:

    【解决方案4】:

    如果你真的想要一个数组,你可以试试下面的

    Arrays.stream("5,9,15,86".split(","))
            .map(Traffic::new)
            .toArray(Traffic[]::new);
    

    如果List&lt;Traffic&gt; 也适合你,我推荐这个

    Arrays.stream("5,9,15,86".split(","))
            .map(Traffic::new)
            .collect(Collectors.toList());
    

    最后,如果你只有 Integer 的构造函数,你可以将 stram 映射到 int 之类的

    Arrays.stream("5,9,15,86".split(","))
            .mapToInt(Integer::valueOf)
            .mapToObj(Traffic::new)
            .collect(Collectors.toList());
    

    编辑

    我在编辑问题之前回答了这个问题,这就是为什么它只是部分答案

    EDIT2

    好的,我明白了,我使用 map 而不是 mapToObj,这是一个多么大的错误...但是感谢@JavaMan 的有用答案,我发现了它(请注意,如果您使用 IntelliJ,它会为您提供替换 @ 987654328@ 和mapToObj)

    【讨论】:

    • 恐怕您的解决方案从未奏效,因为您概述的解决方案不会将拆分值复制到对象属性。此外,如果您尝试了代码,则会出现编译错误。无论如何,这个问题现在尘埃落定。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-01
    • 1970-01-01
    相关资源
    最近更新 更多