Страницы

Поиск по вопросам

пятница, 1 марта 2019 г.

Можно ли упростить цикл, используя java 9 или java 8?

Можно ли как-то упростить этот цикл, используя java 9 или java 8?
for (String s : list) { if (s.indexOf("D") != -1) { numberList.addAll(getDoubleFromString(s)); } else { if (s.indexOf(".") != -1) { numberList.add(new TypeSatellite(BigDecimal.valueOf(Double.valueOf(s)))); } else { numberList.add(new TypeSatellite(Integer.valueOf(s))); } } }


Ответ

Давай-те сделаем оптимизации по шагам (основная сложность непонятно что принимают TypeSatellite и какой тип у numberList, поэтому напишу для object'a):
1) Можно заменить s.indexOf(...) != -1 на s.contains(...), то есть записать что-то вроде
list.forEach(s -> { if (s.contains("D")) { numberList.addAll(getDoubleFromString(s)); } else { if (s.contains(".")) { numberList.add(new TypeSatellite(BigDecimal.valueOf(Double.valueOf(s)))); } else { numberList.add(new TypeSatellite(Integer.valueOf(s))); } } });
2) Можно вынести общий код
list.forEach(s -> { if (s.contains("D")) { numberList.addAll(getDoubleFromString(s)); } else { Object number = s.contains(".") ? BigDecimal.valueOf(Double.valueOf(s)) : Integer.valueOf(s); numberList.add(new TypeSatellite(number)); } });
3) Вынесем общий функцию:
list.forEach(s -> { numberList.addAll(getListNumber(s)); }); }
private static Collection getListNumber(String s) { if (s.contains("D")) { return getDoubleFromString(s)); } else { Object number = s.contains(".") ? BigDecimal.valueOf(Double.valueOf(s)) : Integer.valueOf(s); return Collections.singleton(new TypeSatellite(number)); } }
4) последний шаг используем стрим
numberList = list.stream().flatMap(::getListNumber ).collect(Collectors.toList());
private static Stream getListNumber(String s) { if (s.contains("D")) { return getDoubleFromString(s).stream(); } else { Object number = s.contains(".") ? BigDecimal.valueOf(Double.valueOf(s)) : Integer.valueOf(s); return Stream.of(new TypeSatellite(number)); } }

Комментариев нет:

Отправить комментарий