1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.functor.example.map;
18
19 import java.lang.reflect.Array;
20 import java.util.Iterator;
21 import java.util.Map;
22
23 import org.apache.commons.functor.BinaryPredicate;
24 import org.apache.commons.functor.BinaryProcedure;
25 import org.apache.commons.functor.UnaryPredicate;
26 import org.apache.commons.functor.adapter.BinaryProcedureBinaryFunction;
27 import org.apache.commons.functor.core.composite.ConditionalBinaryFunction;
28
29
30
31
32
33 @SuppressWarnings("unchecked")
34 public class PredicatedMap extends FunctoredMap {
35 public PredicatedMap(Map map, final UnaryPredicate keyPredicate, final UnaryPredicate valuePredicate) {
36 super(map);
37 setOnPut(new ConditionalBinaryFunction(
38 new BinaryPredicate() {
39 public boolean test(Object a, Object b) {
40 return keyPredicate.test(Array.get(b,0)) &&
41 valuePredicate.test(Array.get(b,1));
42 }
43 },
44 DEFAULT_ON_PUT,
45 BinaryProcedureBinaryFunction.adapt(new Throw(new IllegalArgumentException()))));
46
47 setOnPutAll(new BinaryProcedure() {
48 public void run(Object d, Object s) {
49 Map dest = (Map) d;
50 Map src = (Map) s;
51 for (Iterator iter = src.entrySet().iterator(); iter.hasNext(); ) {
52 Map.Entry pair = (Map.Entry) iter.next();
53 if (keyPredicate.test(pair.getKey()) &&
54 valuePredicate.test(pair.getValue())) {
55 dest.put(pair.getKey(),pair.getValue());
56 }
57 }
58 }
59 });
60 }
61 }