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

169
23 октября 2017, 23:55

Можно ли как-то упростить этот цикл, используя 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)));
        }
    }
}
Answer 1

Давай-те сделаем оптимизации по шагам (основная сложность непонятно что принимают 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<Object> 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<Object> 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));
    }
}
READ ALSO
EntityMapping add constraint

EntityMapping add constraint

ЗдравствуйтеПытаюсь строить EntityMapping в Spring boot

159
почему получается 0 [дубликат]

почему получается 0 [дубликат]

На данный вопрос уже ответили:

138
Как вызвать новое окно?

Как вызвать новое окно?

По нажатию кнопки должна появляться новое окно, и закрываться староеЯ использую контроллеры для каждого FXML

199
Проблема из-за изменение Media ссылок

Проблема из-за изменение Media ссылок

Добрый деньВ своём приложение сделал типа коллекцию музыки воспроизводимой MediaPlayer JavaFX

144