Looking for java Keywords? Try Ask4Keywords

Java Language Использование потоков и ссылок на методы для записи самодокументирующих процессов


пример

Ссылки на методы делают отличный самодокументирующий код, а использование ссылок на методы с помощью Stream делает сложные процессы простыми для чтения и понимания. Рассмотрим следующий код:

public interface Ordered {
    default int getOrder(){
        return 0;
    }
}

public interface Valued<V extends Ordered> {
    boolean hasPropertyTwo();
    V getValue();
}

public interface Thing<V extends Ordered> {
    boolean hasPropertyOne();
    Valued<V> getValuedProperty();
}

public <V extends Ordered> List<V> myMethod(List<Thing<V>> things) {
    List<V> results = new ArrayList<V>();
    for (Thing<V> thing : things) {
        if (thing.hasPropertyOne()) {
            Valued<V> valued = thing.getValuedProperty();
            if (valued != null && valued.hasPropertyTwo()){
                V value = valued.getValue();
                if (value != null){
                    results.add(value);
                }
            }
        }
    }
    results.sort((a, b)->{
        return Integer.compare(a.getOrder(), b.getOrder());
    });
    return results;
}

Этот последний метод, переписанный с использованием ссылок Stream и методов, намного читабельнее, и каждый шаг процесса быстро и легко понятен - он не просто короче, он также показывает с первого взгляда, какие интерфейсы и классы отвечают за код на каждом шаге:

public <V extends Ordered> List<V> myMethod(List<Thing<V>> things) {
    return things.stream()
        .filter(Thing::hasPropertyOne)
        .map(Thing::getValuedProperty)
        .filter(Objects::nonNull)
        .filter(Valued::hasPropertyTwo)
        .map(Valued::getValue)
        .filter(Objects::nonNull)
        .sorted(Comparator.comparing(Ordered::getOrder))
        .collect(Collectors.toList());
}