一开始,给定一个对象列表,在我可以使用提供的列表之前,我必须对列表进行一些过滤。很自然地,我做如下:
List<Pokemon> pokemons = ....;
// {A block of code} : Reverse the list
// {A block of code} : Limit the list to N number
// {A block of code} : Only keep pokemons that ....
然后我看看Guava FluentIterable是如何工作的。所以我开始尝试做FluentIterable的工作。
我创建了一个新类,称之为PokemonsBuilder
class PokemonsBuilder{
List<Pokemons> result;
public static newBuilder(){result = new List..};
public PokemonsBuilder from (List<Pokemons> input){result.addAll(input) ; return this};
public PokemonsBuilder apply(Function<List<Pokemons>,List<Pokemons>> filter){ result = filter.apply(result) ; return this};
public List<Pokemons> build(){return result};
}
另一个类,称之为PokemonsBuildOptions
class PokemonsBuildOptions{
public final Function<List<Pokemons>,List<Pokemons>> REVERSE_OPTION(){ return new Function ....}
public final Function<List<Pokemons>,List<Pokemons>> LIMIT_OPTION(int limitTo){ return new Function ....}
public final Function<List<Pokemons>,List<Pokemons>> ABC_OPTION(){ return new Function ....}
}
现在我的代码从
更改了List<Pokemon> pokemons = ....;
// {A block of code} : Reverse the list
// {A block of code} : Limit the list to N number
// {A block of code} : Only keep pokemons that ....
到
List<Pokemons> filteredList = PokemonsBuilder.newBuilder()
.from(pokemons)
.apply(PokemonsBuildOptions.REVERSE_OPTION)
.apply(PokemonsBuildOptions.LIMIT_OPTION)
.apply(PokemonsBuildOptions.ABC_OPTION)
.apply(..Some other options for future usage..)
.build();
到目前为止,我的感觉分为02种不同的方式:
我喜欢新代码,它让事情变得更容易理解(至少对我而言)
我注意到代码行数的增加。然后我开始疑惑:
我是一名初级英国人。因此,任何评论或建议都受到欢迎。
非常感谢。