2015-02-15 3 views
0

Я нахожусь в последней части моего задания и нахожусь в ловушке. Мне нужно преобразовать приведенный ниже код в оператор Lambda, используя метод потока класса InputData, а также цикл forEach, который имеет тот же эффект, что и текущий цикл. Для метода stream я думал об использовании ... inputData.stream(). ForEach (значения -> .... только внутри блока try, но я не могу понять остальную часть синтаксиса для цикла forEach. кто-то мне точку в правильном направлении? Спасибо!Lambda Входной файл в массив

private List<AreaData> readInput(String filename) throws IllegalStateException, 
     NumberFormatException 
{ 
    /* This statement uses the "diamond" operator, since it is possible for 
     the compiler to work out the required generic type. */ 
    final List<AreaData> result = new LinkedList<>(); 
    try(InputData inputData = 
      new InputData(filename, InputData.class, null, 
        Field.values().length, ",")) 
    { 
     /* Iterate through each of the lines of values. */ 
     for(String[] values : inputData) 
     { 
      /* Create a new AreaData object, and add it to the list. */ 
      AreaData next = new AreaData(values); 

      result.add(next); 
     } 
    } 
    return result; 
} 

ответ

2

Предполагая, что inputData.stream() возвращает Stream<String[]> можно использовать операцию по карте на поток, чтобы достичь этого, вместо forEach подхода. функция картографа будет принимать String[] в качестве параметра и вернет новый экземпляр AreaData (и вы можете использовать ссылку на конструктор, чтобы сократить его). Вот как выглядит код с использованием операции карты:

private List<AreaData> readInput(String filename) throws IllegalStateException, NumberFormatException { 
    try(InputData inputData = new InputData(filename, 
              InputData.class, 
              null, 
              Field.values().length, ",")) { 
     return inputData.stream().map(AreaData::new).collect(Collectors.toList()); 
    } 
} 


Если вы должны использовать подход forEach, то вам, в основном, нужно это сделать; для каждого массива String в экземпляре inputData создайте новый экземпляр AreaData и добавьте его в список (так что лямбда будет values -> result.add ...). Однако я чувствую, что этот подход немного странный. На мой взгляд, операция с картой - это то, что вы должны здесь сделать, потому что это действительно сопоставление с каждым массивом из нового экземпляра AreaData.

+0

Спасибо за ответ. К сожалению, назначение вызывает цикл forEach, который будет использоваться. – TheDude76

+1

@ TheDude76 Я отредактировал свой ответ; если что-то еще неясно, дайте мне знать. –

+0

ZouZou Еще раз спасибо за ваш ответ. Я вижу, как использование операции с картой было бы намного проще. Этот цикл forEach действительно не имеет особого смысла в этой ситуации. Тем не менее, forEach - это то, что вызывается :) для этого, я бы использовал операцию Collector после result.add? – TheDude76

Смежные вопросы