package me.ramswaroop.java8; import java.util.Arrays; import java.util.List; import static java.util.Comparator.comparing; import static java.util.stream.Collectors.toList; /** * @author ramswaroop * @version 02/02/2017 */ class Trader { private final String name; private final String city; public Trader(String n, String c) { this.name = n; this.city = c; } public String getName() { return this.name; } public String getCity() { return this.city; } public String toString() { return "Trader:" + this.name + " in " + this.city; } } class Transaction { private final Trader trader; private final int year; private final int value; public Transaction(Trader trader, int year, int value) { this.trader = trader; this.year = year; this.value = value; } public Trader getTrader() { return this.trader; } public int getYear() { return this.year; } public int getValue() { return this.value; } public String toString() { return "{" + this.trader + ", " + "year: " + this.year + ", " + "value:" + this.value + "}"; } } public class Streams { static final Trader raoul = new Trader("Raoul", "Cambridge"); static final Trader mario = new Trader("Mario", "Milan"); static final Trader alan = new Trader("Alan", "Cambridge"); static final Trader brian = new Trader("Brian", "Cambridge"); static final List<Transaction> transactions = Arrays.asList( new Transaction(brian, 2011, 300), new Transaction(raoul, 2012, 1000), new Transaction(raoul, 2011, 400), new Transaction(mario, 2012, 710), new Transaction(mario, 2012, 700), new Transaction(alan, 2012, 950) ); public static List<Transaction> getTransactionsIn2011SortedByValue() { return transactions.stream() .filter(t -> t.getYear() == 2011) .sorted(comparing(Transaction::getValue)) .collect(toList()); } public static List<String> findUniqueCities() { return transactions.stream() .map(t -> t.getTrader().getCity()) .distinct() .collect(toList()); } public static List<Trader> getAllTradersFromCambridgeAndSortByName() { return transactions.stream() .map(Transaction::getTrader) .filter(traders -> traders.getCity().equals("Cambridge")) .distinct() .sorted(comparing(Trader::getName)) .collect(toList()); } public static List<String> getAllTraderNamesAndSortByName() { return transactions.stream() .map(t -> t.getTrader().getName()) .distinct() .sorted() .collect(toList()); } public static boolean areAnyTradersFromMilan() { return transactions.stream() .anyMatch(t -> "Milan".equals(t.getTrader().getCity())); } public static Integer[] getAllTransValuesFromTradersInCambridge() { return transactions.stream() .filter(t -> "Cambridge".equals(t.getTrader().getCity())) .map(Transaction::getValue) .toArray(Integer[]::new); } public static int findHighestTransactionValue() { return transactions.stream() .map(Transaction::getValue) .reduce((t1, t2) -> (t1 > t2) ? t1 : t2) // can replace with .reduce(Integer::max) .get(); } public static Transaction getSmallestTransaction() { return transactions.stream() .reduce((t1, t2) -> t1.getValue() < t2.getValue() ? t1 : t2) .get(); } public static void main(String[] a) { System.out.println("1: " + getTransactionsIn2011SortedByValue()); System.out.println("2: " + findUniqueCities()); System.out.println("3: " + getAllTradersFromCambridgeAndSortByName()); System.out.println("4: " + getAllTraderNamesAndSortByName()); System.out.println("5: " + areAnyTradersFromMilan()); System.out.println("6: " + Arrays.asList(getAllTransValuesFromTradersInCambridge())); System.out.println("7: " + findHighestTransactionValue()); System.out.println("8: " + getSmallestTransaction()); } }