2015-04-18 6 views
2

У меня есть список List<String> (list1) и функция Integer foo(String s). Используя силу Java 8, я хочу преобразовать list1 в List<Integer>, применив foo к каждому элементу list1. Следующий код работает, но есть небольшая проблема:Список <String> в список <Integer> с использованием Integer foo (String s)

List<Integer> list2 = list1.stream().mapToInt(s -> foo(s)).boxed().collect(Collectors.toList()); 

Когда foo возвращается null для некоторого элемента list1 в NullPointerException брошен. Кроме того, мое решение выглядит немного неудобно. Так есть лучший?

ответ

5

Если вы сопоставляете его с Integer, я не вижу необходимости использовать mapToInt, а затем используйте boxed.

Вместо этого вы можете просто использовать map, а затем filter, чтобы исключить нули.

List<Integer> list2 = 
    list1.stream() 
     .map(s -> foo(s)) 
     .filter(Objects::nonNull) 
     .collect(Collectors.toList()); 

Если вы хотите сохранить аннулирует в списке, просто удалите filter

List<Integer> list2 = 
    list1.stream() 
     .map(s -> foo(s)) 
     .collect(Collectors.toList()); 
+0

Вместо написания 's -> foo (s)', можно также написать 'ClassName :: foo', где' ClassName' - это класс, в котором объявляется 'foo()' – Joffrey

1

В качестве альтернативы ответ уже дал, вы можете сделать это:

List<Integer> list2 = new ArrayList<>(); 
list1.forEach(s -> list2.add(foo(s))); 
Смежные вопросы