Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions src/main/java/lambdasinaction/appa/Author.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package lambdasinaction.appa;

import java.lang.annotation.Repeatable;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Repeatable(Authors.class)
@Retention(RetentionPolicy.RUNTIME)
public @interface Author {

String name();

}
11 changes: 11 additions & 0 deletions src/main/java/lambdasinaction/appa/Authors.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package lambdasinaction.appa;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)
public @interface Authors {

Author[] value();

}
17 changes: 17 additions & 0 deletions src/main/java/lambdasinaction/appa/Book.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package lambdasinaction.appa;

import java.util.Arrays;

@Author(name = "Raoul")
@Author(name = "Mario")
@Author(name = "Alan")
public class Book {

public static void main(String[] args) {
Author[] authors = Book.class.getAnnotationsByType(Author.class);
Arrays.asList(authors).stream().forEach(a -> {
System.out.println(a.name());
});
}

}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package lambdasinaction.chap6;
package lambdasinaction.appc;

import java.util.*;
import java.util.concurrent.*;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package lambdasinaction.chap6;
package lambdasinaction.appc;

import lambdasinaction.chap5.*;

Expand Down
12 changes: 12 additions & 0 deletions src/main/java/lambdasinaction/appd/InnerClass.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package lambdasinaction.appd;

import java.util.function.Function;

public class InnerClass {
Function<Object, String> f = new Function<Object, String>() {
@Override
public String apply(Object obj) {
return obj.toString();
}
};
}
7 changes: 7 additions & 0 deletions src/main/java/lambdasinaction/appd/Lambda.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package lambdasinaction.appd;

import java.util.function.Function;

public class Lambda {
Function<Object, String> f = obj -> obj.toString();
}
9 changes: 5 additions & 4 deletions src/main/java/lambdasinaction/chap10/AsyncShop.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
package lambdasinaction.chap10;

import java.text.*;
import java.util.*;
import java.util.concurrent.*;
import static lambdasinaction.chap10.Util.delay;
import static lambdasinaction.chap10.Util.format;

import static lambdasinaction.chap10.Util.*;
import java.util.Random;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Future;

public class AsyncShop {

Expand Down
2 changes: 1 addition & 1 deletion src/main/java/lambdasinaction/chap10/AsyncShopClient.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package lambdasinaction.chap10;

import java.util.concurrent.*;
import java.util.concurrent.Future;

public class AsyncShopClient {

Expand Down
51 changes: 15 additions & 36 deletions src/main/java/lambdasinaction/chap10/BestPriceFinder.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,13 @@
package lambdasinaction.chap10;

import java.util.*;
import java.util.concurrent.*;
import java.util.stream.*;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class BestPriceFinder {

Expand All @@ -20,68 +25,42 @@ public Thread newThread(Runnable r) {
return t;
}
});
/*
public List<String> findPriceSequential(String product) {
return shops.stream()
.map(shop -> shop.getName() + " price is " + shop.calculatePrice(product))
.collect(Collectors.toList());
}

public List<String> findPriceParallel(String product) {
return shops.parallelStream()
.map(shop -> shop.getName() + " price is " + shop.calculatePrice(product))
.collect(Collectors.toList());
}

public List<String> findPrice(String product) {
List<CompletableFuture<String>> priceFutures =
shops.stream()
.map(shop -> CompletableFuture.supplyAsync(() -> shop.getName() + " price is "
+ shop.calculatePrice(product), executor))
.collect(Collectors.toList());

List<String> prices = priceFutures.stream()
.map(CompletableFuture::join)
.collect(Collectors.toList());
return prices;
//return sequence(priceFutures).join();
}
/*/
public List<String> findPriceSequential(String product) {
public List<String> findPricesSequential(String product) {
return shops.stream()
.map(shop -> shop.getPrice(product))
.map(Quote::parse)
.map(Discount::applyDiscount)
.collect(Collectors.toList());
}

public List<String> findPriceParallel(String product) {
public List<String> findPricesParallel(String product) {
return shops.parallelStream()
.map(shop -> shop.getPrice(product))
.map(Quote::parse)
.map(Discount::applyDiscount)
.collect(Collectors.toList());
}

public List<String> findPrice(String product) {
List<CompletableFuture<String>> priceFutures = findPriceStream(product)
public List<String> findPricesFuture(String product) {
List<CompletableFuture<String>> priceFutures = findPricesStream(product)
.collect(Collectors.<CompletableFuture<String>>toList());

return priceFutures.stream()
.map(CompletableFuture::join)
.collect(Collectors.toList());
}

public Stream<CompletableFuture<String>> findPriceStream(String product) {
public Stream<CompletableFuture<String>> findPricesStream(String product) {
return shops.stream()
.map(shop -> CompletableFuture.supplyAsync(() -> shop.getPrice(product), executor))
.map(future -> future.thenApply(Quote::parse))
.map(future -> future.thenCompose(quote -> CompletableFuture.supplyAsync(() -> Discount.applyDiscount(quote), executor)));
}

public void printPricesStream() {
public void printPricesStream(String product) {
long start = System.nanoTime();
CompletableFuture[] futures = findPriceStream("myPhone")
CompletableFuture[] futures = findPricesStream(product)
.map(f -> f.thenAccept(s -> System.out.println(s + " (done in " + ((System.nanoTime() - start) / 1_000_000) + " msecs)")))
.toArray(size -> new CompletableFuture[size]);
CompletableFuture.allOf(futures).join();
Expand Down
16 changes: 7 additions & 9 deletions src/main/java/lambdasinaction/chap10/BestPriceFinderMain.java
Original file line number Diff line number Diff line change
@@ -1,20 +1,17 @@
package lambdasinaction.chap10;

import java.util.*;
import java.util.concurrent.*;
import java.util.function.*;

import static java.util.stream.Collectors.toList;
import java.util.List;
import java.util.function.Supplier;

public class BestPriceFinderMain {

private static BestPriceFinder bestPriceFinder = new BestPriceFinder();

public static void main(String[] args) {
//execute("sequential", () -> bestPriceFinder.findPriceSequential("myPhone"));
//execute("parallel", () -> bestPriceFinder.findPriceParallel("myPhone"));
execute("composed CompletableFuture", () -> bestPriceFinder.findPrice("myPhone"));
//bestPriceFinder.printPricesStream();
execute("sequential", () -> bestPriceFinder.findPricesSequential("myPhone27S"));
execute("parallel", () -> bestPriceFinder.findPricesParallel("myPhone27S"));
execute("composed CompletableFuture", () -> bestPriceFinder.findPricesFuture("myPhone27S"));
bestPriceFinder.printPricesStream("myPhone27S");
}

private static void execute(String msg, Supplier<List<String>> s) {
Expand All @@ -23,4 +20,5 @@ private static void execute(String msg, Supplier<List<String>> s) {
long duration = (System.nanoTime() - start) / 1_000_000;
System.out.println(msg + " done in " + duration + " msecs");
}

}
5 changes: 2 additions & 3 deletions src/main/java/lambdasinaction/chap10/Discount.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
package lambdasinaction.chap10;

import java.util.*;

import static lambdasinaction.chap10.Util.*;
import static lambdasinaction.chap10.Util.delay;
import static lambdasinaction.chap10.Util.format;

public class Discount {

Expand Down
26 changes: 26 additions & 0 deletions src/main/java/lambdasinaction/chap10/ExchangeService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package lambdasinaction.chap10;

import static lambdasinaction.chap10.Util.delay;

public class ExchangeService {

public enum Money {
USD(1.0), EUR(1.35387), GBP(1.69715), CAD(.92106), MXN(.07683);

private final double rate;

Money(double rate) {
this.rate = rate;
}
}

public static double getRate(Money source, Money destination) {
return getRateWithDelay(source, destination);
}

private static double getRateWithDelay(Money source, Money destination) {
delay();
return destination.rate / source.rate;
}

}
5 changes: 3 additions & 2 deletions src/main/java/lambdasinaction/chap10/Shop.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
package lambdasinaction.chap10;

import java.util.*;
import static lambdasinaction.chap10.Util.delay;
import static lambdasinaction.chap10.Util.format;

import static lambdasinaction.chap10.Util.*;
import java.util.Random;

public class Shop {

Expand Down
11 changes: 7 additions & 4 deletions src/main/java/lambdasinaction/chap10/Util.java
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
package lambdasinaction.chap10;

import java.text.*;
import java.util.*;
import java.util.concurrent.*;
import java.util.stream.*;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.util.List;
import java.util.Locale;
import java.util.Random;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors;

public class Util {

Expand Down
Loading