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>> {