Changeset 13544
- Timestamp:
- 06/09/08 00:24:37 (5 years ago)
- Location:
- lang/java/jduck/trunk/src
- Files:
-
- 3 modified
-
main/java/org/coderepos/lang/java/jduck/Eachable.java (modified) (3 diffs)
-
main/java/org/coderepos/lang/java/jduck/For.java (modified) (1 diff)
-
test/java/org/coderepos/lang/java/jduck/ForTest.java (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
lang/java/jduck/trunk/src/main/java/org/coderepos/lang/java/jduck/Eachable.java
r13537 r13544 18 18 public class Eachable<T> { 19 19 20 private Iterable<T> [] iterables;20 private Iterable<T> iterable; 21 21 22 public Eachable(Iterable<T> ... iterables) {23 this.iterable s = iterables;22 public Eachable(Iterable<T> iterable) { 23 this.iterable = iterable; 24 24 } 25 25 … … 30 30 */ 31 31 public void each(Eval<T> eval) { 32 for (Iterable<T> iterable : iterables) { 33 for (T it : ((Iterable<T>) iterable)) { 34 eval.eval(it); 35 } 32 for (T it : ((Iterable<T>) iterable)) { 33 eval.eval(it); 36 34 } 37 }38 39 /**40 * 全対象に対して、指定されたConvert実装の処理を適用する。41 *42 * @param <E>43 * @param conv44 * @return45 */46 public <E> List<E> collect(Convert<T, E> conv) {47 List<E> result = new ArrayList<E>();48 for (Iterable<T> iterable : iterables) {49 for (T it : ((Iterable<T>) iterable)) {50 E converted = conv.convert(it);51 if (converted != null) {52 result.add(converted);53 }54 }55 }56 return result;57 35 } 58 36 … … 68 46 69 47 /** 48 * 全対象に対して、指定されたConvert実装の処理を適用する。 49 * 50 * @param <E> 51 * @param conv 52 * @return 53 */ 54 public <E> List<E> collect(Convert<T, E> conv) { 55 List<E> result = new ArrayList<E>(); 56 for (T it : ((Iterable<T>) iterable)) { 57 E converted = conv.convert(it); 58 if (converted != null) { 59 result.add(converted); 60 } 61 } 62 return result; 63 } 64 65 /** 70 66 * 全対象に対して、指定されたオブジェクトがConvertインタフェースを実装しているとみなして処理を適用する。 71 67 * -
lang/java/jduck/trunk/src/main/java/org/coderepos/lang/java/jduck/For.java
r13537 r13544 9 9 10 10 public static <T> Eachable<T> in(Iterable<T> iterable) { 11 //return new Eachable<T>(iterable); 12 return every(iterable); 11 return new Eachable<T>(iterable); 13 12 } 14 13 15 public static <T> Eachable<T> every(Iterable<T>... iterables) {16 return new Eachable<T>(iterables);17 }18 14 } -
lang/java/jduck/trunk/src/test/java/org/coderepos/lang/java/jduck/ForTest.java
r13537 r13544 1 1 package org.coderepos.lang.java.jduck; 2 2 3 import java.util.ArrayList; 3 4 import java.util.Arrays; 4 5 import java.util.List; … … 11 12 public class ForTest extends TestCase { 12 13 13 private List< String> listObject;14 private List< String> listObject2;14 private List<?> listObject; 15 private List<?> listObject2; 15 16 16 17 @Override … … 19 20 listObject = Arrays.asList("A", "B", "C"); 20 21 listObject2 = Arrays.asList("1", "3", "5"); 22 resultList_for_ダックタイピングによる実行_このテストクラス自体.clear(); 21 23 System.out.println("============"); 22 24 } 23 25 24 public void testEach() throws Exception { 25 // 普通の拡張forループ 26 @Override 27 protected void tearDown() throws Exception { 28 super.tearDown(); 29 System.out.println(); 30 } 31 32 /** 33 * コレクションのそれぞれの要素に対して何らかの処理を適用する。 34 * これで良いといえば十分良いのだけど。 35 */ 36 public void testEach_普通の拡張forループ() throws Exception { 37 List<String> result = new ArrayList<String>(); 26 38 for (Object it : listObject) { 27 39 System.out.print(it); 40 result.add(it.toString()); 28 41 } 29 System.out.println(); 42 assertEquals(Arrays.asList("A", "B", "C"), result); 43 } 30 44 31 // 流れるようなインタフェース - 無名内部クラスの直接渡し 32 // 使い捨てのLamdaを対象に対して実行する。 45 /** 46 * コレクションのそれぞれの要素に対して何らかの処理を適用する。 47 * 使い捨てのEvalを対象に対して実行する。 48 */ 49 public void testEach_流れるようなインタフェース_無名内部クラスの直接渡し() throws Exception { 50 final List<String> result = new ArrayList<String>(); 33 51 For.in(listObject).each(new Eval<String>() { 34 52 public void eval(String it) { 35 53 System.out.print(it); 54 result.add(it.toString()); 36 55 } 37 56 }); 38 System.out.println(); 57 assertEquals(Arrays.asList("A", "B", "C"), result); 58 } 39 59 40 // 流れるようなインタフェース - インスタンスの変数渡し 41 // 同じDoItを複数のコレクションに対して実行する。 60 /** 61 * コレクションのそれぞれの要素に対して何らかの処理を適用する。 62 * 同じEvalを複数のコレクションに対して実行する。 63 */ 64 public void testEach_流れるようなインタフェース_インスタンスの変数渡し() throws Exception { 65 final List<String> result = new ArrayList<String>(); 42 66 Eval<String> doIt = new Eval<String>() { 43 67 public void eval(String it) { 44 68 System.out.print(it); 69 result.add(it.toString()); 45 70 } 46 71 }; 47 72 For.in(listObject).each(doIt); 73 assertEquals(Arrays.asList("A", "B", "C"), result); 48 74 For.in(listObject2).each(doIt); 49 System.out.println(); 50 51 // 複数のListにたいして全部ぶん回す。 52 Eachable<String> every = For.every(listObject, listObject2); 53 every.each(doIt); 54 System.out.println(); 55 56 // 指定Listが空なら何も実行されない。 57 For.every().each(doIt); 58 System.out.println(); 75 assertEquals(Arrays.asList("A", "B", "C", "1", "3", "5"), result); 59 76 } 60 77 78 /** 79 * コレクションのそれぞれの要素に対して何らかの処理を適用する。 80 * Evalインタフェースを実装していない無名内部クラスを使って、 81 * ダックタイピング的に実行する。 82 */ 83 public void testEach_ダックタイピングによる実行_無名内部クラス() throws Exception { 84 final List<String> result = new ArrayList<String>(); 85 For.in(listObject).each(new Object() { 86 @SuppressWarnings("unused") 87 public void eval(String it) { // @SuppressWarnings("unused")がないと未使用警告が出てしまう... 88 System.out.print(it); 89 result.add(it.toString()); 90 } 91 }); 92 assertEquals(Arrays.asList("A", "B", "C"), result); 93 } 94 95 /** 96 * コレクションのそれぞれの要素に対して何らかの処理を適用する。 97 * Evalインタフェースを実装していないこのテストクラス自体を使って、 98 * ダックタイピング的に実行する。 99 */ 100 public void testEach_ダックタイピングによる実行_このテストクラス自体() throws Exception { 101 For.in(listObject).each(this); 102 assertEquals(Arrays.asList("A", "B", "C"), resultList_for_ダックタイピングによる実行_このテストクラス自体); 103 } 104 105 /** 106 * コレクションの一部を変換/除外した結果を返す。 107 */ 61 108 public void testCollect() throws Exception { 62 109 List<Integer> collected = For.in(listObject2).collect(new Convert<String, Integer>() { … … 66 113 } 67 114 }); 68 System.out.print ln(collected);115 System.out.print(collected); 69 116 assertEquals(Arrays.asList(1, 5), collected); 70 117 } 71 118 119 /** 120 * コレクションの一部を変換/除外した結果を返す。 121 * Evalインタフェースを実装していないこのテストクラス自体を使って、 122 * ダックタイピング的に実行する。 123 */ 124 public void testCollect_ダックタイピングによる実行_このテストクラス自体() throws Exception { 125 List<Integer> collected = For.in(listObject2).collect(this); 126 System.out.print(collected); 127 assertEquals(Arrays.asList(1, 3), collected); 128 } 129 130 // 「ダックタイピングによる実行_このテストクラス自体」シリーズ用のフィールド/メソッド定義 131 private final List<String> resultList_for_ダックタイピングによる実行_このテストクラス自体 = new ArrayList<String>(); 132 133 public void eval(String it) { 134 System.out.print(it); 135 resultList_for_ダックタイピングによる実行_このテストクラス自体.add(it); 136 } 137 138 public Integer convert(String it) { 139 if (it.equals("5")) return null; // nullにするとcollectされない 140 return Integer.valueOf(it); 141 } 72 142 }
![(please configure the [header_logo] section in trac.ini)](/share/chrome/site/your_project_logo.png)