Skip to content

Commit 96ace09

Browse files
committed
Convert demo to use lambdas
1 parent d244930 commit 96ace09

15 files changed

Lines changed: 55 additions & 216 deletions

demo/src/main/java/fj/demo/Array_bind.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,7 @@
99
public final class Array_bind {
1010
public static void main(final String[] args) {
1111
final Array<Integer> a = array(97, 44, 67, 3, 22, 90, 1, 77, 98, 1078, 6, 64, 6, 79, 42);
12-
final Array<Integer> b = a.bind(new F<Integer, Array<Integer>>() {
13-
public Array<Integer> f(final Integer i) {
14-
return array(500, i);
15-
}
16-
});
12+
final Array<Integer> b = a.bind(i -> array(500, i));
1713
arrayShow(intShow).println(b);
1814
// {500,97,500,44,500,67,500,3,500,22,500,90,500,1,500,77,500,98,500,1078,500,6,500,64,500,6,500,79,500,42}
1915
}

demo/src/main/java/fj/demo/ChequeWrite.java

Lines changed: 9 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,7 @@ public final class ChequeWrite {
2525
private ChequeWrite() {}
2626

2727
static List<Integer> toZero(final int from) {
28-
return unfold(new F<Integer, Option<P2<Integer, Integer>>>() {
29-
public Option<P2<Integer, Integer>> f(final Integer i) {
30-
return i < 0 ? Option.<P2<Integer, Integer>>none() : some(p(i, i - 1));
31-
}
32-
}, from);
28+
return unfold(i -> i < 0 ? Option.<P2<Integer, Integer>>none() : some(p(i, i - 1)), from);
3329
}
3430

3531
static int signum(final int i) {
@@ -80,12 +76,9 @@ static List<Character> show(final List<Character> cs) {
8076
static <A> List<P2<List<A>, Integer>> split(final List<A> as) {
8177
final int len = as.length();
8278

83-
final List<List<A>> ds = as.zip(toZero(len - 1)).foldRight(new F2<P2<A, Integer>, List<List<A>>, List<List<A>>>() {
84-
public List<List<A>> f(final P2<A, Integer> ki, final List<List<A>> z) {
85-
return ki._2() % 3 == 0 ? z.conss(single(ki._1())) : z.tail().conss(z.head().cons(ki._1()));
86-
}
87-
}, List.<List<A>>nil());
88-
79+
final List<List<A>> ds = as.zip(toZero(len - 1)).foldRight((ki, z) ->
80+
ki._2() % 3 == 0 ? z.conss(single(ki._1())) : z.tail().conss(z.head().cons(ki._1())), List.<List<A>>nil()
81+
);
8982
return ds.zip(toZero(len / 3 + signum(len % 3) - 1));
9083
}
9184

@@ -103,19 +96,14 @@ static boolean and(final List<Character> cs) {
10396
}
10497

10598
static boolean existsNotZero(final List<Character> cs) {
106-
return cs.exists(new F<Character, Boolean>() {
107-
public Boolean f(final Character c) {
108-
return c != '0';
109-
}
110-
});
99+
return cs.exists(c -> c != '0');
111100
}
112101

113102
static boolean eq(final List<Character> a, final List<Character> b) {
114103
return listEqual(charEqual).eq(a, b);
115104
}
116105

117-
static final F<List<Character>, List<Character>> dollars = new F<List<Character>, List<Character>>() {
118-
public List<Character> f(final List<Character> cs) {
106+
static final F<List<Character>, List<Character>> dollars = cs -> {
119107
if (cs.isEmpty())
120108
return fromString("zero dollars");
121109
else {
@@ -144,25 +132,19 @@ public void f(final P2<List<Character>, Integer> z) {
144132

145133
return fromString(" ").intercalate(x.toList());
146134
}
147-
}
135+
148136
};
149137

150-
static final F<List<Character>, List<Character>> cents = new F<List<Character>, List<Character>>() {
151-
public List<Character> f(final List<Character> a) {
138+
static final F<List<Character>, List<Character>> cents = a -> {
152139
final int n = a.length();
153140
return n == 0
154141
? fromString("zero cents")
155142
: show(list(a.head(), n == 1 ? '0' : a.tail().head()))
156143
.append(fromString(eq(a, list('0', '1')) ? " cent" : " cents"));
157-
}
158144
};
159145

160146
public static List<Character> write(final List<Character> cs) {
161-
final F<List<Character>, List<Character>> dropNonDigit = new F<List<Character>, List<Character>>() {
162-
public List<Character> f(final List<Character> cs) {
163-
return cs.filter(Characters.isDigit);
164-
}
165-
};
147+
final F<List<Character>, List<Character>> dropNonDigit = cs2 -> cs2.filter(Characters.isDigit);
166148
final P2<List<Character>, List<Character>> x =
167149
cs.dropWhile(charEqual.eq('0')).breakk(charEqual.eq('.')).map1(dropNonDigit).map1(dollars).map2(dropNonDigit)
168150
.map2(List.<Character>take().f(2)).map2(cents);

demo/src/main/java/fj/demo/Comonad_example.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,11 @@ public static void main(final String[] args) {
2525
public static Stream<Stream<Character>> perms(final Stream<Character> s) {
2626
Stream<Stream<Character>> r = single(Stream.<Character>nil());
2727
for (final Zipper<Character> z : fromStream(s))
28-
r = join(z.cobind(new F<Zipper<Character>, Stream<Stream<Character>>>() {
29-
public Stream<Stream<Character>> f(final Zipper<Character> zp) {
30-
return perms(zp.lefts().reverse().append(zp.rights()))
31-
.map(F1Functions.o(Stream.<Character>cons().f(zp.focus()), P.<Stream<Character>>p1()));
32-
}
33-
}).toStream());
28+
r = join(z.cobind(zp ->
29+
perms(zp.lefts().reverse().append(zp.rights())).map(
30+
F1Functions.o(Stream.<Character>cons().f(zp.focus()), P.<Stream<Character>>p1())
31+
)
32+
).toStream());
3433
return r;
3534
}
3635
}

demo/src/main/java/fj/demo/Option_bind.java

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -18,21 +18,9 @@ public static void main(final String[] args) {
1818
final Option<Integer> o5 = o2.bind(f);
1919
final Option<Integer> o6 = o3.bind(f);
2020

21-
final Option<Integer> p1 = o1.bind(new F<Integer, Option<Integer>>() {
22-
public Option<Integer> f(final Integer i) {
23-
return i % 2 == 0 ? some(i * 3) : Option.<Integer>none();
24-
}
25-
});
26-
final Option<Integer> p2 = o2.bind(new F<Integer, Option<Integer>>() {
27-
public Option<Integer> f(final Integer i) {
28-
return i % 2 == 0 ? some(i * 3) : Option.<Integer>none();
29-
}
30-
});
31-
final Option<Integer> p3 = o3.bind(new F<Integer, Option<Integer>>() {
32-
public Option<Integer> f(final Integer i) {
33-
return i % 2 == 0 ? some(i * 3) : Option.<Integer>none();
34-
}
35-
});
21+
final Option<Integer> p1 = o1.bind(i -> i % 2 == 0 ? some(i * 3) : Option.<Integer>none());
22+
final Option<Integer> p2 = o2.bind(i -> i % 2 == 0 ? some(i * 3) : Option.<Integer>none());
23+
final Option<Integer> p3 = o3.bind(i -> i % 2 == 0 ? some(i * 3) : Option.<Integer>none());
3624

3725
optionShow(intShow).println(o4); // None
3826
optionShow(intShow).println(o5); // Some(24)

demo/src/main/java/fj/demo/Set_map.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,7 @@
1010
public final class Set_map {
1111
public static void main(final String[] args) {
1212
final Set<Integer> a = empty(Ord.intOrd).insert(1).insert(2).insert(3).insert(4).insert(5).insert(6);
13-
final Set<Integer> b = a.map(Ord.intOrd, new F<Integer, Integer>() {
14-
public Integer f(final Integer i) {
15-
return i / 2; // divide each integer by 2
16-
}
17-
});
13+
final Set<Integer> b = a.map(Ord.intOrd, i -> i / 2);
1814
listShow(intShow).println(b.toList()); // [3,2,1,0]
1915
}
2016
}

demo/src/main/java/fj/demo/concurrent/MapReduce.java

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,24 +28,20 @@ public class MapReduce {
2828
// Count words of documents in parallel
2929
public static Promise<Long> countWords(final List<Stream<Character>> documents,
3030
final ParModule m) {
31-
return m.parFoldMap(documents, new F<Stream<Character>, Long>() {
32-
public Long f(final Stream<Character> document) {
33-
return (long) fromStream(document).words().length();
34-
}
35-
}, longAdditionMonoid);
31+
return m.parFoldMap(documents,
32+
document -> (long) fromStream(document).words().length(), longAdditionMonoid
33+
);
3634
}
3735

3836
// Main program does the requisite IO gymnastics
3937
public static void main(final String[] args) {
4038
final List<Stream<Character>> documents = list(args).map(
41-
F1Functions.andThen(new F<String, BufferedReader>() {
42-
public BufferedReader f(final String fileName) {
39+
F1Functions.andThen(fileName -> {
4340
try {
4441
return new BufferedReader(new FileReader(new File(fileName)));
4542
} catch (FileNotFoundException e) {
4643
throw new Error(e);
4744
}
48-
}
4945
}, new F<BufferedReader, Stream<Character>>() {
5046
public Stream<Character> f(final BufferedReader reader) {
5147
final Option<String> s;

demo/src/main/java/fj/demo/concurrent/WordCount.java

Lines changed: 15 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -43,12 +43,7 @@
4343
public class WordCount {
4444

4545
// Integers.add.f(1) caused an SOE...
46-
private static final F<Integer,Integer> addOne = new F<Integer,Integer>() {
47-
@Override
48-
public Integer f(Integer a) {
49-
return a.intValue() + 1;
50-
}
51-
};
46+
private static final F<Integer,Integer> addOne = a -> a.intValue() + 1;
5247

5348
private static <K, V> Map<K, V> update(Map<K, V> map, K key, F<V, V> valueFunction,
5449
V initialValue) {
@@ -60,37 +55,28 @@ private static <K, V> Map<K, V> update(Map<K, V> map, K key, F<V, V> valueFuncti
6055
return map;
6156
}
6257

63-
private static final F<String, Map<String, Integer>> fileNameToWordsAndCountsWithCharChunkIteratee = new F<String, Map<String, Integer>>() {
64-
@Override
65-
public Map<String, Integer> f(final String fileName) {
58+
private static final F<String, Map<String, Integer>> fileNameToWordsAndCountsWithCharChunkIteratee = fileName -> {
6659
try {
6760
return IOFunctions.enumFileCharChunks(new File(fileName), Option.<Charset>none(), wordCountsFromCharChunks()).run().run();
6861
} catch (final IOException e) {
6962
throw new RuntimeException(e);
7063
}
71-
}
7264
};
7365

74-
private static final F<String, Map<String, Integer>> fileNameToWordsAndCountsWithCharChunk2Iteratee = new F<String, Map<String, Integer>>() {
75-
@Override
76-
public Map<String, Integer> f(final String fileName) {
66+
private static final F<String, Map<String, Integer>> fileNameToWordsAndCountsWithCharChunk2Iteratee = fileName -> {
7767
try {
7868
return IOFunctions.enumFileChars(new File(fileName), Option.<Charset> none(), wordCountsFromChars()).run().run();
7969
} catch (final IOException e) {
8070
throw new RuntimeException(e);
8171
}
82-
}
8372
};
8473

85-
private static final F<String, Map<String, Integer>> fileNameToWordsAndCountsWithCharIteratee = new F<String, Map<String, Integer>>() {
86-
@Override
87-
public Map<String, Integer> f(final String fileName) {
74+
private static final F<String, Map<String, Integer>> fileNameToWordsAndCountsWithCharIteratee = fileName -> {
8875
try {
8976
return IOFunctions.enumFileChars(new File(fileName), Option.<Charset> none(), wordCountsFromChars()).run().run();
9077
} catch (final IOException e) {
9178
throw new RuntimeException(e);
9279
}
93-
}
9480
};
9581

9682
/** An iteratee that consumes char chunks and calculates word counts */
@@ -145,12 +131,7 @@ public IterV<char[], Map<String, Integer>> _1() {
145131
return IterV.done(acc._2(), Input.<char[]>eof());
146132
}
147133
};
148-
return new F<Input<char[]>, IterV<char[], Map<String, Integer>>>() {
149-
@Override
150-
public IterV<char[], Map<String, Integer>> f(final Input<char[]> s) {
151-
return s.apply(empty, el, eof);
152-
}
153-
};
134+
return s -> s.apply(empty, el, eof);
154135
}
155136
};
156137
return IterV.cont(step.f(P.p(new StringBuilder(), (Map<String, Integer>)new HashMap<String, Integer>())));
@@ -164,20 +145,10 @@ public static final <E> IterV<Character, Map<String, Integer>> wordCountsFromCha
164145

165146
@Override
166147
public F<Input<Character>, IterV<Character, Map<String, Integer>>> f(final P2<StringBuilder,Map<String, Integer>> acc) {
167-
final P1<IterV<Character, Map<String, Integer>>> empty =
168-
new P1<IterV<Character, Map<String, Integer>>>() {
169-
@Override
170-
public IterV<Character, Map<String, Integer>> _1() {
171-
return IterV.cont(step.f(acc));
172-
}
173-
};
148+
final P1<IterV<Character, Map<String, Integer>>> empty = P.lazy(() -> IterV.cont(step.f(acc)));
174149
final P1<F<Character, IterV<Character, Map<String, Integer>>>> el =
175-
new P1<F<Character, IterV<Character, Map<String, Integer>>>>() {
176-
@Override
177-
public F<Character, IterV<Character, Map<String, Integer>>> _1() {
178-
return new F<Character, Iteratee.IterV<Character, Map<String, Integer>>>() {
179-
@Override
180-
public IterV<Character, Map<String, Integer>> f(final Character e) {
150+
P.lazy(() -> {
151+
return e -> {
181152
if(Character.isWhitespace(e.charValue())) {
182153
final StringBuilder sb = acc._1();
183154
if(sb.length() > 0) {
@@ -193,28 +164,18 @@ public IterV<Character, Map<String, Integer>> f(final Character e) {
193164
acc._1().append(e);
194165
return IterV.cont(step.f(acc));
195166
}
196-
}
197167
};
198-
}
199-
};
200-
final P1<IterV<Character, Map<String, Integer>>> eof =
201-
new P1<IterV<Character, Map<String, Integer>>>() {
202-
@Override
203-
public IterV<Character, Map<String, Integer>> _1() {
168+
});
169+
final P1<IterV<Character, Map<String, Integer>>> eof = P.lazy(() -> {
204170
final StringBuilder sb = acc._1();
205171
if(sb.length() > 0) {
206172
final Map<String, Integer> map = update(acc._2(), sb.toString(), addOne, Integer.valueOf(0));
207173
return IterV.done(map, Input.<Character>eof());
208174
}
209175
return IterV.done(acc._2(), Input.<Character>eof());
210176
}
211-
};
212-
return new F<Input<Character>, IterV<Character, Map<String, Integer>>>() {
213-
@Override
214-
public IterV<Character, Map<String, Integer>> f(final Input<Character> s) {
215-
return s.apply(empty, el, eof);
216-
}
217-
};
177+
);
178+
return s -> s.apply(empty, el, eof);
218179
}
219180
};
220181
return IterV.cont(step.f(P.p(new StringBuilder(), (Map<String, Integer>)new HashMap<String, Integer>())));
@@ -229,11 +190,7 @@ public static void main(String[] args) throws IOException {
229190
final P2<List<String>, Map<String, Integer>> result = writeSampleFiles(numFiles, numSharedWords);
230191
final List<String> fileNames = result._1();
231192
final Map<String, Integer> expectedWordsAndCounts = result._2();
232-
long avgSize = fileNames.foldLeft(new F2<Long, String, Long>() {
233-
@Override
234-
public Long f(Long a, String file) {
235-
return a.longValue() + new File(file).length();
236-
}}, 0l) / fileNames.length();
193+
long avgSize = fileNames.foldLeft((a, file) -> a.longValue() + new File(file).length(), 0l) / fileNames.length();
237194
System.out.println("Processing " + numFiles + " files with ~"+numSharedWords+" words and an avg size of " + avgSize + " bytes.");
238195

239196
// warmup
@@ -349,12 +306,7 @@ private static P2<List<String>, Map<String, Integer>> writeSampleFiles(
349306
public static Map<String, Integer> getWordsAndCountsFromFilesWithIteratee(final List<String> fileNames,
350307
final F<String, Map<String, Integer>> fileNameToWordsAndCountsWithIteratee) {
351308
final List<Map<String, Integer>> maps = fileNames.map(fileNameToWordsAndCountsWithIteratee);
352-
return maps.foldLeft(new F2<Map<String, Integer>, Map<String, Integer>, Map<String, Integer>>() {
353-
@Override
354-
public Map<String, Integer> f(Map<String, Integer> a, Map<String, Integer> b) {
355-
return plus(a, b);
356-
}
357-
}, new HashMap<String, Integer>());
309+
return maps.foldLeft((Map<String, Integer> a, Map<String, Integer> b) -> plus(a, b), new HashMap<String, Integer>());
358310
}
359311

360312
public static Map<String, Integer> getWordsAndCountsFromFilesInParallel(
@@ -374,21 +326,7 @@ public static Map<String, Integer> getWordsAndCountsFromFilesInParallel(
374326
public static Promise<Map<String, Integer>> getWordsAndCountsFromFiles(
375327
final List<String> fileNames, final F<String, Map<String, Integer>> fileNameToWordsAndCounts, final ParModule m) {
376328
final F<Map<String, Integer>, F<Map<String, Integer>, Map<String, Integer>>> MapSum =
377-
new F<Map<String, Integer>, F<Map<String, Integer>, Map<String, Integer>>>() {
378-
@Override
379-
public F<Map<String, Integer>, Map<String, Integer>> f(
380-
final Map<String, Integer> a) {
381-
return new F<Map<String, Integer>, Map<String, Integer>>() {
382-
383-
@Override
384-
public Map<String, Integer> f(final Map<String, Integer> b) {
385-
return plus(a, b);
386-
}
387-
388-
};
389-
}
390-
391-
};
329+
a -> b -> plus(a, b);
392330
final Monoid<Map<String, Integer>> monoid = monoid(MapSum,
393331
new HashMap<String, Integer>());
394332
return m.parFoldMap(fileNames, fileNameToWordsAndCounts, monoid);

demo/src/main/java/fj/demo/euler/Problem1.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,7 @@ public static void main(final String[] args) {
1818
}
1919

2020
public static void java7() {
21-
out.println(sum(range(0, 1000).filter(new F<Integer, Boolean>() {
22-
public Boolean f(final Integer a) { return a % 3 == 0 || a % 5 == 0;}
23-
})));
21+
out.println(sum(range(0, 1000).filter(a -> a % 3 == 0 || a % 5 == 0)));
2422
}
2523

2624
public static void java8() {

demo/src/main/java/fj/demo/euler/Problem3.java

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package fj.demo.euler;
22

33
import fj.F;
4+
import fj.P;
45
import fj.P1;
56
import static fj.data.Enumerator.naturalEnumerator;
67
import fj.data.Natural;
@@ -17,13 +18,7 @@
1718
*/
1819
public class Problem3 {
1920
// An infinite stream of all the primes.
20-
public static final Stream<Natural> primes = cons(natural(2).some(), new P1<Stream<Natural>>() {
21-
public Stream<Natural> _1() {
22-
return forever(naturalEnumerator, natural(3).some(), 2).filter(new F<Natural, Boolean>() {
23-
public Boolean f(final Natural n) {return primeFactors(n).length() == 1;}
24-
});
25-
}
26-
});
21+
public static final Stream<Natural> primes = cons(natural(2).some(), P.lazy(() -> forever(naturalEnumerator, natural(3).some(), 2).filter(n -> primeFactors(n).length() == 1)));
2722

2823
//Finds factors of a given number.
2924
public static Stream<Natural> factor(final Natural n, final Natural p, final P1<Stream<Natural>> ps) {

0 commit comments

Comments
 (0)