Эквивалентность IntStream в Swift

#java #swift5 #code-conversion #intstream

#java #swift5 #преобразование кода #intstream

Вопрос:

Я исследую некоторые компоненты в Java и задаюсь вопросом, как лучше всего преобразовать следующий фрагмент кода Java в Swift.

 public void doTest(ArrayList<Double> items) {
    // I know that I should check the count of items. Let's say the count is 10.
    double max = IntStream.range(1, 5)
                    .mapToDouble(i -> items.get(i) - items.get(i - 1))
                    .max().getAsDouble();
}
  

Насколько я знаю, в Swift нет эквивалентных параллельных агрегированных операций для репликации IntStream. Нужно ли мне писать несколько вложенных циклов или какое-либо лучшее решение? Спасибо.

Ответ №1:

Я считаю, что это самый короткий Swift-эквивалент вашей функции:

 func doTest(items: [Double]) -> Double? {
    return (1...5)
        .map { i in items[i] - items[i - 1] }
        .max()
}
  

Я использую оператор диапазона Swift вместо IntStream.

Вот тест для этой функции:

 func testDoTest() throws {
    let items = [2.2, 4.4, 1.1, 3.3, 7.7, 8.8, 5.5, 9.9, 6.6]
    print("1 through 5: (items[1...5])")
    let result = doTest(items: items)
    print("result: (String(describing: result))")
}
  

Вот результат:

 1 through 5: [4.4, 1.1, 3.3, 7.7, 8.8]
result: Optional(4.4)