Changeset 13544

Show
Ignore:
Timestamp:
06/09/08 00:24:37 (5 years ago)
Author:
nobeans
Message:

For.every()系を削除した(サンプルとしての複雑さがあがるだけで、面白さはそれほどでも、と思ったため)。
テストメソッドをバラして、不足分を追加した。

Location:
lang/java/jduck/trunk/src
Files:
3 modified

Legend:

Unmodified
Added
Removed
  • lang/java/jduck/trunk/src/main/java/org/coderepos/lang/java/jduck/Eachable.java

    r13537 r13544  
    1818public class Eachable<T> { 
    1919 
    20     private Iterable<T>[] iterables; 
     20    private Iterable<T> iterable; 
    2121 
    22     public Eachable(Iterable<T>... iterables) { 
    23         this.iterables = iterables; 
     22    public Eachable(Iterable<T> iterable) { 
     23        this.iterable = iterable; 
    2424    } 
    2525 
     
    3030     */ 
    3131    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); 
    3634        } 
    37     } 
    38  
    39     /** 
    40      * 全対象に対して、指定されたConvert実装の処理を適用する。 
    41      *  
    42      * @param <E> 
    43      * @param conv 
    44      * @return 
    45      */ 
    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; 
    5735    } 
    5836 
     
    6846 
    6947    /** 
     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    /** 
    7066     * 全対象に対して、指定されたオブジェクトがConvertインタフェースを実装しているとみなして処理を適用する。 
    7167     *  
  • lang/java/jduck/trunk/src/main/java/org/coderepos/lang/java/jduck/For.java

    r13537 r13544  
    99 
    1010    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); 
    1312    } 
    1413 
    15     public static <T> Eachable<T> every(Iterable<T>... iterables) { 
    16         return new Eachable<T>(iterables); 
    17     } 
    1814} 
  • lang/java/jduck/trunk/src/test/java/org/coderepos/lang/java/jduck/ForTest.java

    r13537 r13544  
    11package org.coderepos.lang.java.jduck; 
    22 
     3import java.util.ArrayList; 
    34import java.util.Arrays; 
    45import java.util.List; 
     
    1112public class ForTest extends TestCase { 
    1213 
    13     private List<String> listObject; 
    14     private List<String> listObject2; 
     14    private List<?> listObject; 
     15    private List<?> listObject2; 
    1516 
    1617    @Override 
     
    1920        listObject = Arrays.asList("A", "B", "C"); 
    2021        listObject2 = Arrays.asList("1", "3", "5"); 
     22        resultList_for_ダックタイピングによる実行_このテストクラス自体.clear(); 
    2123        System.out.println("============"); 
    2224    } 
    2325 
    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>(); 
    2638        for (Object it : listObject) { 
    2739            System.out.print(it); 
     40            result.add(it.toString()); 
    2841        } 
    29         System.out.println(); 
     42        assertEquals(Arrays.asList("A", "B", "C"), result); 
     43    } 
    3044 
    31         // 流れるようなインタフェース - 無名内部クラスの直接渡し 
    32         // 使い捨てのLamdaを対象に対して実行する。 
     45    /**  
     46     * コレクションのそれぞれの要素に対して何らかの処理を適用する。 
     47     * 使い捨てのEvalを対象に対して実行する。 
     48     */ 
     49    public void testEach_流れるようなインタフェース_無名内部クラスの直接渡し() throws Exception { 
     50        final List<String> result = new ArrayList<String>(); 
    3351        For.in(listObject).each(new Eval<String>() { 
    3452            public void eval(String it) { 
    3553                System.out.print(it); 
     54                result.add(it.toString()); 
    3655            } 
    3756        }); 
    38         System.out.println(); 
     57        assertEquals(Arrays.asList("A", "B", "C"), result); 
     58    } 
    3959 
    40         // 流れるようなインタフェース - インスタンスの変数渡し 
    41         // 同じDoItを複数のコレクションに対して実行する。 
     60    /** 
     61     * コレクションのそれぞれの要素に対して何らかの処理を適用する。 
     62     * 同じEvalを複数のコレクションに対して実行する。 
     63     */ 
     64    public void testEach_流れるようなインタフェース_インスタンスの変数渡し() throws Exception { 
     65        final List<String> result = new ArrayList<String>(); 
    4266        Eval<String> doIt = new Eval<String>() { 
    4367            public void eval(String it) { 
    4468                System.out.print(it); 
     69                result.add(it.toString()); 
    4570            } 
    4671        }; 
    4772        For.in(listObject).each(doIt); 
     73        assertEquals(Arrays.asList("A", "B", "C"), result); 
    4874        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); 
    5976    } 
    6077 
     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     */ 
    61108    public void testCollect() throws Exception { 
    62109        List<Integer> collected = For.in(listObject2).collect(new Convert<String, Integer>() { 
     
    66113            } 
    67114        }); 
    68         System.out.println(collected); 
     115        System.out.print(collected); 
    69116        assertEquals(Arrays.asList(1, 5), collected); 
    70117    } 
    71118 
     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    } 
    72142}