Свойство Java 8, разделенное запятой, для объекта - PullRequest
0 голосов
/ 24 января 2019

У меня есть три списка, разделенных запятыми (список автобусов, автомобилей, циклов), и я пытаюсь записать их в свойства объектов Java с помощью потоков Java 8.

Ниже приведено описание того, что я пробовал:

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());

Ответы [ 4 ]

0 голосов
/ 24 января 2019

Если вы хотите создать 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());
0 голосов
/ 24 января 2019

Если вам действительно нужен массив, вы можете попробовать следующее

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

Если вам также подходит List<Traffic>, я рекомендую этот

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());

EDIT

Я ответил на этот вопрос до того, как вопрос былотредактировано, поэтому это только частичный ответ

EDIT2

Хорошо, я понял, я использовал map вместо mapToObj, что огромная ошибка ..Но я выяснил это благодаря полезным ответам @ JavaMan (обратите внимание, что если вы используете IntelliJ, он предлагает вам заменить map на mapToObj)

0 голосов
/ 24 января 2019

Определите конструктор в классе 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";

Следующая инструкция потока возвращает список объектов Traffic с присвоенным значением.

    List<Traffic> listOfIntegers = 
      Arrays.asList(commaList.split(","))
        .stream()
        .map(e -> new Traffic(Integer.valueOf(e)))
        .collect(Collectors.toList());
0 голосов
/ 24 января 2019

Вам просто нужно разделить вашу строку и затем сопоставить каждое значение с вашим объектом.

Здесь я предполагаю, что значение может быть передано через конструктор вашего Traffic объекта.Если нет, вы можете создать его и установить его значение в 2 отдельных строки.mapToInt необходимо, если ожидается, что value будет целым числом.

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());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...