diff --git a/pom.xml b/pom.xml index 10e5035e..37cbf712 100644 --- a/pom.xml +++ b/pom.xml @@ -37,8 +37,8 @@ maven-compiler-plugin 3.1 - 1.9 - 1.9 + 1.8 + 1.8 diff --git a/src/main/java/lambdasinaction/chap10/OperationsWithOptional.java b/src/main/java/lambdasinaction/chap10/OperationsWithOptional.java index d2940969..fb5bc0ce 100644 --- a/src/main/java/lambdasinaction/chap10/OperationsWithOptional.java +++ b/src/main/java/lambdasinaction/chap10/OperationsWithOptional.java @@ -12,10 +12,10 @@ public static void main(String... args) { System.out.println(max(empty(), of(5))); Optional opt1 = of(5); - Optional opt2 = opt1.or(() -> of(4)); + Optional opt2 = of(opt1.orElse(4)); System.out.println( - of(5).or(() -> of(4)) + of(5).orElse(4) ); } diff --git a/src/main/java/lambdasinaction/chap10/OptionalMain.java b/src/main/java/lambdasinaction/chap10/OptionalMain.java deleted file mode 100644 index dcd97792..00000000 --- a/src/main/java/lambdasinaction/chap10/OptionalMain.java +++ /dev/null @@ -1,24 +0,0 @@ -package lambdasinaction.chap10; - -import java.util.*; - -import static java.util.stream.Collectors.toSet; - -public class OptionalMain { - - public String getCarInsuranceName(Optional person) { - return person.flatMap(Person::getCar) - .flatMap(Car::getInsurance) - .map(Insurance::getName) - .orElse("Unknown"); - } - - public Set getCarInsuranceNames(List persons) { - return persons.stream() - .map(Person::getCar) - .map(optCar -> optCar.flatMap(Car::getInsurance)) - .map(optInsurance -> optInsurance.map(Insurance::getName)) - .flatMap(Optional::stream) - .collect(toSet()); - } -} diff --git a/src/main/java/lambdasinaction/chap5/PuttingIntoPracticeKoans.java b/src/main/java/lambdasinaction/chap5/PuttingIntoPracticeKoans.java new file mode 100644 index 00000000..624e283c --- /dev/null +++ b/src/main/java/lambdasinaction/chap5/PuttingIntoPracticeKoans.java @@ -0,0 +1,68 @@ +package lambdasinaction.chap5; + +import org.junit.Test; + +import java.util.Arrays; +import java.util.List; + +import static org.hamcrest.core.IsEqual.equalTo; +import static org.junit.Assert.assertThat; + + +public class PuttingIntoPracticeKoans { + final static Trader raoul = new Trader("Raoul", "Cambridge"); + final static Trader mario = new Trader("Mario", "Milan"); + final static Trader alan = new Trader("Alan", "Cambridge"); + final static Trader brian = new Trader("Brian", "Cambridge"); + + final static List 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) + ); + + @Test + public void koan1() { + // Koan 1: Find all transactions from year 2011 and sort them by value (small to high). + List tr2011 = null; // transactions.stream()... + assertThat(tr2011, equalTo(Arrays.asList(new Transaction(brian, 2011, 300), new Transaction(raoul, 2011, 400)))); + } + + @Test + public void koan2() { + // Koan 2: What are all the unique cities where the traders work? + List cities = null; // transactions.stream()... + assertThat(cities, equalTo(Arrays.asList("Cambridge", "Milan"))); + } + + @Test + public void koan3() { + // Koan 3: Find all traders from Cambridge and sort them by name. + List traders = null; // transactions.stream()... + assertThat(traders, equalTo(Arrays.asList(alan, brian, raoul))); + } + + @Test + public void koan4() { + // Koan 4: Return a string of all traders’ names sorted alphabetically. + String traderStr = null; // transactions.stream()... + assertThat(traderStr, equalTo("AlanBrianMarioRaoul")); + } + + @Test + public void koan5() { + // Koan 5: Are there any trader based in Milan? + boolean milanBased = false; // transactions.stream()... + assertThat(milanBased, equalTo(true)); + } + + @Test + public void koan6() { + // Koan 6: What's the highest value in all the transactions? + int highestValue = 0; // transactions.stream()... + assertThat(highestValue, equalTo(1000)); + } +} \ No newline at end of file diff --git a/src/main/java/lambdasinaction/chap5/Trader.java b/src/main/java/lambdasinaction/chap5/Trader.java index 7487a8c6..26b5a4ba 100644 --- a/src/main/java/lambdasinaction/chap5/Trader.java +++ b/src/main/java/lambdasinaction/chap5/Trader.java @@ -24,4 +24,22 @@ public void setCity(String newCity){ public String toString(){ return "Trader:"+this.name + " in " + this.city; } + + @Override + public boolean equals(final Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + final Trader trader = (Trader) o; + + if (name != null ? !name.equals(trader.name) : trader.name != null) return false; + return city != null ? city.equals(trader.city) : trader.city == null; + } + + @Override + public int hashCode() { + int result = name != null ? name.hashCode() : 0; + result = 31 * result + (city != null ? city.hashCode() : 0); + return result; + } } \ No newline at end of file diff --git a/src/main/java/lambdasinaction/chap5/Transaction.java b/src/main/java/lambdasinaction/chap5/Transaction.java index 754e3839..2175122f 100644 --- a/src/main/java/lambdasinaction/chap5/Transaction.java +++ b/src/main/java/lambdasinaction/chap5/Transaction.java @@ -1,33 +1,52 @@ package lambdasinaction.chap5; -public class Transaction{ - - private Trader trader; - private int year; - private 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 Transaction { + + private Trader trader; + private int year; + private int value; + + public Transaction(Trader trader, int year, int value) { + this.trader = trader; + this.year = year; + this.value = value; + } + + @Override + public int hashCode() { + int result = trader != null ? trader.hashCode() : 0; + result = 31 * result + year; + result = 31 * result + value; + return result; + } + + @Override + public boolean equals(final Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + final Transaction that = (Transaction) o; + + if (year != that.year) return false; + if (value != that.value) return false; + return trader != null ? trader.equals(that.trader) : that.trader == null; + } + + public String toString() { + return "{" + this.trader + ", " + + "year: " + this.year + ", " + + "value:" + this.value + "}"; + } + + public Trader getTrader() { + return this.trader; + } + + public int getYear() { + return this.year; + } + + public int getValue() { + return this.value; + } } \ No newline at end of file diff --git a/src/main/java/lambdasinaction/chap6/Grouping.java b/src/main/java/lambdasinaction/chap6/Grouping.java index 9105cc80..616fcad5 100644 --- a/src/main/java/lambdasinaction/chap6/Grouping.java +++ b/src/main/java/lambdasinaction/chap6/Grouping.java @@ -13,7 +13,6 @@ enum CaloricLevel { DIET, NORMAL, FAT }; public static void main(String ... args) { System.out.println("Dishes grouped by type: " + groupDishesByType()); System.out.println("Dish names grouped by type: " + groupDishNamesByType()); - System.out.println("Dish tags grouped by type: " + groupDishTagsByType()); System.out.println("Caloric dishes grouped by type: " + groupCaloricDishesByType()); System.out.println("Dishes grouped by caloric level: " + groupDishesByCaloricLevel()); System.out.println("Dishes grouped by type and caloric level: " + groupDishedByTypeAndCaloricLevel()); @@ -32,13 +31,8 @@ private static Map> groupDishNamesByType() { return menu.stream().collect(groupingBy(Dish::getType, mapping(Dish::getName, toList()))); } - private static Map> groupDishTagsByType() { - return menu.stream().collect(groupingBy(Dish::getType, flatMapping(dish -> dishTags.get( dish.getName() ).stream(), toSet()))); - } - private static Map> groupCaloricDishesByType() { -// return menu.stream().filter(dish -> dish.getCalories() > 500).collect(groupingBy(Dish::getType)); - return menu.stream().collect(groupingBy(Dish::getType, filtering(dish -> dish.getCalories() > 500, toList()))); + return menu.stream().filter(dish -> dish.getCalories() > 500).collect(groupingBy(Dish::getType)); } private static Map> groupDishesByCaloricLevel() { diff --git a/src/main/java/lambdasinaction/chap6/PartitionPrimeNumbers.java b/src/main/java/lambdasinaction/chap6/PartitionPrimeNumbers.java index 69d7c4ca..ec4d6c37 100644 --- a/src/main/java/lambdasinaction/chap6/PartitionPrimeNumbers.java +++ b/src/main/java/lambdasinaction/chap6/PartitionPrimeNumbers.java @@ -32,10 +32,10 @@ public static Map> partitionPrimesWithCustomCollector(int public static boolean isPrime(List primes, Integer candidate) { double candidateRoot = Math.sqrt((double) candidate); - //return takeWhile(primes, i -> i <= candidateRoot).stream().noneMatch(i -> candidate % i == 0); - return primes.stream().takeWhile(i -> i <= candidateRoot).noneMatch(i -> candidate % i == 0); + return takeWhile(primes, i -> i <= candidateRoot).stream().noneMatch(i -> candidate % i == 0); +// return primes.stream().takeWhile(i -> i <= candidateRoot).noneMatch(i -> candidate % i == 0); } -/* + public static List takeWhile(List list, Predicate p) { int i = 0; for (A item : list) { @@ -46,7 +46,7 @@ public static List takeWhile(List list, Predicate p) { } return list; } -*/ + public static class PrimeNumbersCollector implements Collector>, Map>> {