Java8 метод цепочки для одного объекта без потока / необязательно - PullRequest
0 голосов
/ 07 мая 2019

Мне показалось, что проще всего уловить мой вопрос на следующем примере. Я хотел бы применить несколько преобразований к объекту (в этом случае все они возвращают один и тот же класс, номер, но не обязательно). С помощью Optional (метод 3) или Stream (метод 4) я могу использовать .map элегантно и разборчиво. Однако при использовании с одним объектом мне нужно либо просто создать Optional, чтобы просто использовать цепочку .map (с .get () в конце), либо использовать Stream.of () с findFirst в конце, что кажется ненужной работой.

[Мои предпочтения]: я предпочитаю методы 3 и 4, так как они кажутся более удобными для чтения, чем параметры до java8 - методы 1 и 2.

[Вопрос]: Есть ли лучший / аккуратный / более предпочтительный / более элегантный способ достижения того же, что и все методы, используемые здесь? Если нет, какой метод вы бы использовали?

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Tester {

    static class Number {
        private final int value;

        private Number(final int value) {
            this.value = value;
        }

        public int getValue() {
            return value;
        }

        @Override
        public String toString() {
            return String.valueOf(value);
        }
    }

    private static Number add(final Number number, final int val) {
        return new Number(number.getValue() + val);
    }

    private static Number multiply(final Number number, final int val) {
        return new Number(number.getValue() * val);
    }

    private static Number subtract(final Number number, final int val) {
        return new Number(number.getValue() - val);
    }

    public static void main(final String[] args) {
        final Number input = new Number(1);

        System.out.println("output1 = " + method1(input)); // 100
        System.out.println("output2 = " + method2(input)); // 100
        System.out.println("output3 = " + method3(input)); // 100
        System.out.println("output4 = " + method4(input)); // 100

        processAList();
    }

    // Processing an object - Method 1
    private static Number method1(final Number input) {
        return subtract(multiply(add(input, 10), 10), 10);
    }

    // Processing an object - Method 2
    private static Number method2(final Number input) {
        final Number added = add(input, 10);
        final Number multiplied = multiply(added, 10);
        return subtract(multiplied, 10);
    }

    // Processing an object - Method 3 (Contrived use of Optional)
    private static Number method3(final Number input) {
        return Optional.of(input)
            .map(number -> add(number, 10))
            .map(number -> multiply(number, 10))
            .map(number -> subtract(number, 10)).get();
    }

    // Processing an object - Method 4 (Contrived use of Stream)
    private static Number method4(final Number input) {
        return Stream.of(input)
            .map(number -> add(number, 10))
            .map(number -> multiply(number, 10))
            .map(number -> subtract(number, 10))
            .findAny().get();
    }

    // Processing a list (naturally uses the Stream advantage)
    private static void processAList() {
        final List<Number> inputs = new ArrayList<>();
        inputs.add(new Number(1));
        inputs.add(new Number(2));

        final List<Number> outputs = inputs.stream()
            .map(number -> add(number, 10))
            .map(number -> multiply(number, 10))
            .map(number -> subtract(number, 10))
            .collect(Collectors.toList());

        System.out.println("outputs = " + outputs); // [100, 110]
    }
}

1 Ответ

0 голосов
/ 08 мая 2019

Решение состоит в том, чтобы встроить ваши методы в ваш класс Number.Например:

static class Number {
    // instance variable, constructor and getter unchanged

    public Number add(final int val) {
        return new Number(getValue() + val);
    }

    // mulitply() and subtract() in the same way

    // toString() unchanged
}

Теперь ваш код становится очень простым и читаемым:

private static Number method5(final Number input) {
    return input
        .add(10)
        .multiply(10)
        .subtract(10);
}

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

    return input.add(10).multiply(10).subtract(10);
...