New file
This commit is contained in:
parent
950a8b9303
commit
f035b454c9
29
innerclasses/ArgReturnReferences.java
Normal file
29
innerclasses/ArgReturnReferences.java
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
//: innerclasses/ArgReturnReferences.java
|
||||||
|
// Demonstrates method references
|
||||||
|
import java.util.function.*;
|
||||||
|
import static net.mindview.util.Print.*;
|
||||||
|
|
||||||
|
class Y {
|
||||||
|
static Y create() { return new Y(); }
|
||||||
|
static void absorb(Y y) {}
|
||||||
|
static String transform1(Y y) { return "Y"; }
|
||||||
|
static String transform2(Y y, String s) {
|
||||||
|
return "Y" + " " + s;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class ArgReturnReferences {
|
||||||
|
Supplier<Y> supply = Y::create;
|
||||||
|
Consumer<Y> consume = Y::absorb;
|
||||||
|
Function<Y, String> f1arg = Y::transform1;
|
||||||
|
BiFunction<Y, String, String> f2arg =
|
||||||
|
Y::transform2;
|
||||||
|
public static void main(String[] args) {
|
||||||
|
ArgReturnReferences arr =
|
||||||
|
new ArgReturnReferences();
|
||||||
|
Y y = arr.supply.get();
|
||||||
|
arr.consume.accept(y);
|
||||||
|
print(arr.f1arg.apply(y));
|
||||||
|
print(arr.f2arg.apply(y, "Howdy"));
|
||||||
|
}
|
||||||
|
} ///:~
|
29
innerclasses/CtorReference.java
Normal file
29
innerclasses/CtorReference.java
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
//: innerclasses/CtorReference.java
|
||||||
|
// Demonstrates java.util.function
|
||||||
|
import java.util.function.*;
|
||||||
|
import static net.mindview.util.Print.*;
|
||||||
|
|
||||||
|
public class CtorReference {
|
||||||
|
public CtorReference() {
|
||||||
|
print("Inside CtorReference()");
|
||||||
|
}
|
||||||
|
public CtorReference(int i) {
|
||||||
|
print("Inside CtorReference(i)");
|
||||||
|
}
|
||||||
|
public CtorReference(int i, double d) {
|
||||||
|
print("Inside CtorReference(i, d)");
|
||||||
|
}
|
||||||
|
public static void main(String[] args) {
|
||||||
|
Supplier<CtorReference> cr0 =
|
||||||
|
CtorReference::new;
|
||||||
|
CtorReference r0 = cr0.get();
|
||||||
|
|
||||||
|
Function<Integer, CtorReference> cr1 =
|
||||||
|
CtorReference::new;
|
||||||
|
CtorReference r1 = cr1.apply(1);
|
||||||
|
|
||||||
|
BiFunction<Integer, Double, CtorReference> cr2 =
|
||||||
|
CtorReference::new;
|
||||||
|
CtorReference r2 = cr2.apply(1, 2.0);
|
||||||
|
}
|
||||||
|
} ///:~
|
22
innerclasses/MethodReferences.java
Normal file
22
innerclasses/MethodReferences.java
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
//: innerclasses/MethodReferences.java
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
public class MethodReferences {
|
||||||
|
static class Description {
|
||||||
|
String describe;
|
||||||
|
public Description(String desc) {
|
||||||
|
describe = desc;
|
||||||
|
}
|
||||||
|
public void show() { System.out.println(describe); }
|
||||||
|
}
|
||||||
|
public static void main(String[] args) {
|
||||||
|
List<String> keys = Arrays.asList(
|
||||||
|
"Every", "Good", "Boy", "Deserves", "Fudge");
|
||||||
|
keys.forEach(System.out::println); // (1)
|
||||||
|
|
||||||
|
List<Description> descriptions = new ArrayList<>();
|
||||||
|
for(String k : keys)
|
||||||
|
descriptions.add(new Description(k));
|
||||||
|
descriptions.forEach(Description::show); // (2)
|
||||||
|
}
|
||||||
|
} ///:~
|
31
innerclasses/RunnableMethodReference.java
Normal file
31
innerclasses/RunnableMethodReference.java
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
//: innerclasses/RunnableMethodReference.java
|
||||||
|
// Demonstrates method references
|
||||||
|
import static net.mindview.util.Print.*;
|
||||||
|
|
||||||
|
class External {
|
||||||
|
static void go() { print("External.go()"); }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class RunnableMethodReference {
|
||||||
|
Runnable robject, rstatic, rexstatic;
|
||||||
|
void f() { print("f()"); }
|
||||||
|
static void g() { print("g()"); }
|
||||||
|
public void assign() {
|
||||||
|
robject = this::f;
|
||||||
|
rstatic = RunnableMethodReference::g;
|
||||||
|
rexstatic = External::go;
|
||||||
|
}
|
||||||
|
public void call() {
|
||||||
|
robject.run();
|
||||||
|
rstatic.run();
|
||||||
|
rexstatic.run();
|
||||||
|
}
|
||||||
|
public static void main(String[] args) {
|
||||||
|
RunnableMethodReference rmr =
|
||||||
|
new RunnableMethodReference();
|
||||||
|
rmr.assign();
|
||||||
|
rmr.call();
|
||||||
|
rmr.robject = rmr::f;
|
||||||
|
rmr.robject.run();
|
||||||
|
}
|
||||||
|
} ///:~
|
23
innerclasses/UnboundMethodReference.java
Normal file
23
innerclasses/UnboundMethodReference.java
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
//: innerclasses/UnboundMethodReference.java
|
||||||
|
// Method reference without an object.
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.function.*;
|
||||||
|
import static net.mindview.util.Print.*;
|
||||||
|
|
||||||
|
class X {
|
||||||
|
String f() { return "X.f()"; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class UnboundMethodReference {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
Function<String, Integer> len = String::length;
|
||||||
|
print(len.apply("UnboundMethodReference"));
|
||||||
|
|
||||||
|
List<String> words =
|
||||||
|
Arrays.asList("Rain", "Spain", "Plain");
|
||||||
|
words.forEach(System.out::println);
|
||||||
|
|
||||||
|
Function<X, String> xfr = X::f;
|
||||||
|
print(xfr.apply(new X()));
|
||||||
|
}
|
||||||
|
} ///:~
|
14
net/mindview/util/PrintArray.java
Normal file
14
net/mindview/util/PrintArray.java
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
//: net/mindview/util/PrintArray.java
|
||||||
|
// Display an array of double
|
||||||
|
package net.mindview.util;
|
||||||
|
|
||||||
|
public class PrintArray {
|
||||||
|
public static void printArray(double[] array) {
|
||||||
|
for(int i = 0; i < array.length; i++) {
|
||||||
|
System.out.print(array[i]);
|
||||||
|
if(i != array.length -1)
|
||||||
|
System.out.print(", ");
|
||||||
|
}
|
||||||
|
System.out.println();
|
||||||
|
}
|
||||||
|
} ///:~
|
47
patterns/CommandPattern2.java
Normal file
47
patterns/CommandPattern2.java
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
//: patterns/CommandPattern2.java
|
||||||
|
// Using the Runnable functional interface
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
class Command2 {
|
||||||
|
public Runnable execute;
|
||||||
|
}
|
||||||
|
|
||||||
|
class Hello2 extends Command2 {
|
||||||
|
Hello2() {
|
||||||
|
execute = () -> System.out.print("Hello ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class World2 extends Command2 {
|
||||||
|
World2() {
|
||||||
|
execute = () -> System.out.print("World! ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class IAm2 extends Command2 {
|
||||||
|
IAm2() {
|
||||||
|
execute = () ->
|
||||||
|
System.out.print("I'm the command pattern!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class Macro2 extends Command2 {
|
||||||
|
private List<Command2> commands =
|
||||||
|
new ArrayList<>();
|
||||||
|
public void add(Command2 c) { commands.add(c); }
|
||||||
|
Macro2() {
|
||||||
|
execute = () -> {
|
||||||
|
for(Command2 c: commands) c.execute.run();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class CommandPattern2 {
|
||||||
|
public static void main(String args[]) {
|
||||||
|
Macro2 macro = new Macro2();
|
||||||
|
macro.add(new Hello2());
|
||||||
|
macro.add(new World2());
|
||||||
|
macro.add(new IAm2());
|
||||||
|
macro.execute.run();
|
||||||
|
}
|
||||||
|
} ///:~
|
34
patterns/CommandPattern3.java
Normal file
34
patterns/CommandPattern3.java
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
//: patterns/CommandPattern3.java
|
||||||
|
// Just implement the Runnable interface!
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
class Hello3 implements Runnable {
|
||||||
|
public void run() { System.out.print("Hello "); }
|
||||||
|
}
|
||||||
|
|
||||||
|
class World3 implements Runnable {
|
||||||
|
public void run() { System.out.print("World! "); }
|
||||||
|
}
|
||||||
|
|
||||||
|
class IAm3 implements Runnable {
|
||||||
|
public void run() {
|
||||||
|
System.out.print("I'm the command pattern!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class Macro3 implements Runnable {
|
||||||
|
public List<Runnable> commands = new ArrayList<>();
|
||||||
|
public void run() {
|
||||||
|
for(Runnable c: commands) c.run();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class CommandPattern3 {
|
||||||
|
public static void main(String args[]) {
|
||||||
|
Macro3 macro = new Macro3();
|
||||||
|
macro.commands.add(new Hello3());
|
||||||
|
macro.commands.add(new World3());
|
||||||
|
macro.commands.add(new IAm3());
|
||||||
|
macro.run();
|
||||||
|
}
|
||||||
|
} ///:~
|
49
patterns/absfactory/GameEnvironment2.java
Normal file
49
patterns/absfactory/GameEnvironment2.java
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
//: patterns/absfactory/GameEnvironment2.java
|
||||||
|
// Using the Supplier<> Functional Interface.
|
||||||
|
package patterns.absfactory;
|
||||||
|
import java.util.function.*;
|
||||||
|
|
||||||
|
class GameElementFactory2 {
|
||||||
|
Supplier<Player> player;
|
||||||
|
Supplier<Obstacle> obstacle;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Concrete factories:
|
||||||
|
class KittiesAndPuzzles2
|
||||||
|
extends GameElementFactory2 {
|
||||||
|
KittiesAndPuzzles2() {
|
||||||
|
player = Kitty::new;
|
||||||
|
obstacle = Puzzle::new;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class KillAndDismember2
|
||||||
|
extends GameElementFactory2 {
|
||||||
|
KillAndDismember2() {
|
||||||
|
player = KungFuGuy::new;
|
||||||
|
obstacle = NastyWeapon::new;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class GameEnvironment2 {
|
||||||
|
private Player p;
|
||||||
|
private Obstacle ob;
|
||||||
|
public GameEnvironment2(
|
||||||
|
GameElementFactory2 factory) {
|
||||||
|
p = factory.player.get();
|
||||||
|
ob = factory.obstacle.get();
|
||||||
|
}
|
||||||
|
public void play() {
|
||||||
|
p.interactWith(ob);
|
||||||
|
}
|
||||||
|
public static void main(String args[]) {
|
||||||
|
GameElementFactory2
|
||||||
|
kp = new KittiesAndPuzzles2(),
|
||||||
|
kd = new KillAndDismember2();
|
||||||
|
GameEnvironment2
|
||||||
|
g1 = new GameEnvironment2(kp),
|
||||||
|
g2 = new GameEnvironment2(kd);
|
||||||
|
g1.play();
|
||||||
|
g2.play();
|
||||||
|
}
|
||||||
|
} ///:~
|
61
patterns/chain/ChainOfResponsibility2.java
Normal file
61
patterns/chain/ChainOfResponsibility2.java
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
//: patterns/chain/ChainOfResponsibility2.java
|
||||||
|
// Using the Functional interface.
|
||||||
|
package patterns.chain;
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.function.*;
|
||||||
|
import static net.mindview.util.PrintArray.*;
|
||||||
|
|
||||||
|
class FindMinima2 {
|
||||||
|
public static Result leastSquares(double[] line) {
|
||||||
|
System.out.println("LeastSquares.algorithm");
|
||||||
|
boolean weSucceed = false;
|
||||||
|
if(weSucceed) // Actual test/calculation here
|
||||||
|
return new Result(new double[] { 1.1, 2.2 });
|
||||||
|
else // Try the next one in the chain:
|
||||||
|
return new Fail();
|
||||||
|
}
|
||||||
|
public static Result perturbation(double[] line) {
|
||||||
|
System.out.println("Perturbation.algorithm");
|
||||||
|
boolean weSucceed = false;
|
||||||
|
if(weSucceed) // Actual test/calculation here
|
||||||
|
return new Result(new double[] { 3.3, 4.4 });
|
||||||
|
else
|
||||||
|
return new Fail();
|
||||||
|
}
|
||||||
|
public static Result bisection(double[] line) {
|
||||||
|
System.out.println("Bisection.algorithm");
|
||||||
|
boolean weSucceed = true;
|
||||||
|
if(weSucceed) // Actual test/calculation here
|
||||||
|
return new Result(new double[] { 5.5, 6.6 });
|
||||||
|
else
|
||||||
|
return new Fail();
|
||||||
|
}
|
||||||
|
static List<Function<double[], Result>> algorithms =
|
||||||
|
Arrays.asList(
|
||||||
|
FindMinima2::leastSquares,
|
||||||
|
FindMinima2::perturbation,
|
||||||
|
FindMinima2::bisection
|
||||||
|
);
|
||||||
|
public static Result minima(double[] line) {
|
||||||
|
for (Function<double[], Result> alg : algorithms) {
|
||||||
|
Result result = alg.apply(line);
|
||||||
|
if(result.success)
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
return new Fail();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class ChainOfResponsibility2 {
|
||||||
|
public static void main(String args[]) {
|
||||||
|
FindMinima solver = new FindMinima();
|
||||||
|
double[] line = {
|
||||||
|
1.0, 2.0, 1.0, 2.0, -1.0,
|
||||||
|
3.0, 4.0, 5.0, 4.0 };
|
||||||
|
Result result = solver.minima(line);
|
||||||
|
if(result.success)
|
||||||
|
printArray(result.line);
|
||||||
|
else
|
||||||
|
System.out.println("No algorithm found");
|
||||||
|
}
|
||||||
|
} ///:~
|
35
patterns/strategy/StrategyPattern2.java
Normal file
35
patterns/strategy/StrategyPattern2.java
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
//: patterns/strategy/StrategyPattern2.java
|
||||||
|
package patterns.strategy;
|
||||||
|
import java.util.function.*;
|
||||||
|
import static net.mindview.util.PrintArray.*;
|
||||||
|
|
||||||
|
// "Context" is now incorporated:
|
||||||
|
class FindMinima2 {
|
||||||
|
Function<double[], double[]> algorithm;
|
||||||
|
FindMinima2() { leastSquares(); } // default
|
||||||
|
// The various strategies:
|
||||||
|
void leastSquares() {
|
||||||
|
algorithm = (line) -> new double[] { 1.1, 2.2 };
|
||||||
|
}
|
||||||
|
void perturbation() {
|
||||||
|
algorithm = (line) -> new double[] { 3.3, 4.4 };
|
||||||
|
}
|
||||||
|
void bisection() {
|
||||||
|
algorithm = (line) -> new double[] { 5.5, 6.6 };
|
||||||
|
}
|
||||||
|
double[] minima(double[] line) {
|
||||||
|
return algorithm.apply(line);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class StrategyPattern2 {
|
||||||
|
public static void main(String args[]) {
|
||||||
|
FindMinima2 solver = new FindMinima2();
|
||||||
|
double[] line = {
|
||||||
|
1.0, 2.0, 1.0, 2.0, -1.0,
|
||||||
|
3.0, 4.0, 5.0, 4.0 };
|
||||||
|
printArray(solver.minima(line));
|
||||||
|
solver.bisection();
|
||||||
|
printArray(solver.minima(line));
|
||||||
|
}
|
||||||
|
} ///:~
|
Loading…
x
Reference in New Issue
Block a user