Группировка потока с использованием критериев условий без использования forEach и двух внешних списков - PullRequest
0 голосов
/ 24 сентября 2018

У меня есть объект торговли, который имеет inQty, outQty и tradeType.TradeType может быть «Fixed» или «Moveable».Поля количества имеют тип Double.

Используя потоки java 8, можно разделить поток на две группы, как показано ниже

1.All Trades that are 'Fixed' + All trades that are 'Moveable' and
have both inQty and outQty greater than 0.0

2. All trades that are 'Moveable' and inQty and outQty are zero value
(0.0)

Один известный мне подход заключается в использовании forEach идобавить объекты в два разных массива списков сделок. Есть ли лучший подход для достижения этого?

List<Trade> storageAndNonZeroMoveableTrades= new ArrayList<>();
List<Trade> zeroMoveableTrades= new ArrayList<>();
trades.forEach( i -> {
            if(i.tradeType().equals(STORAGE_TRADE)){
                storageAndNonZeroMoveableTrades.add(i);
            }else if(i.tradeType().equals(MOVEABLE_TRADE)){
                    if(Double.compare(i.inQty(), 0.0d) != 0 &&
                        Double.compare(i.outQty(), 0.0d) != 0){
                            storageAndNonZeroMoveableTrades.add(i);
                }else{
                        zeroMoveableTrades.add(i);
                    }
            }
        });

1 Ответ

0 голосов
/ 24 сентября 2018

Другой вариант - использовать groupingBy Collector.

public class Main {
    public static void main(String... args) {
        Trade t1 = new Trade(0.0, 0.0, FIXED);
        Trade t2 = new Trade(1.1, 2.2, FIXED);
        Trade t3 = new Trade(0.0, 0.0, MOVEABLE);
        Trade t4 = new Trade(3.3, 4.4, MOVEABLE);
        Stream<Trade> trades = Stream.of(t1, t2, t3, t4);

        Map<String, List<Trade>> groups = trades.collect(Collectors.groupingBy(Main::classify));
        System.out.println(groups);
    }

    static String classify(Trade to) {
        return (to.tradeType == MOVEABLE && to.inQty == 0 && to.outQty == 0)
                ? "zeroMoveableTrades" : "storageAndNonZeroMoveableTrades";
    }

    public static class Trade {
        public final double inQty;
        public final double outQty;
        public final TradeType tradeType;

        public Trade(double inQty, double outQty, TradeType tradeType) {
            this.inQty = inQty;
            this.outQty = outQty;
            this.tradeType = tradeType;
        }
        @Override
        public String toString() {
            return "{inQty="+ inQty +", outQty="+ outQty +", tradeType="+ tradeType +"}";
        }
    }

    public enum TradeType {
        FIXED, MOVEABLE
    }
}
...