なんかだいぶ的外れな話を書く気もするのですが…(^^;独り言に近い雑記です。
Java 8が無事にリリースされて、世間では既に開発現場や業務での利用を検討しているケースが多いと思いますが、自分のいる現場ではまだ即導入という感じにはできなかったりします(^^;
理由はいろいろですが、やはり一番はチームメンバが共通的に読めるように、まずはならないとね…というあたりが結局は大きいと思います(もちろんマネージャの説得などもあったりしますががが)
かといって、今のままチーム皆が何もせずにJava 7で普通に開発を進めても、結局Java 8で7の書き方のままとなるような…(^^;
で、今日一緒に開発してる人と、Java 8のStream APIを利用するような処理に備えて、Java 7使った実務で少しでも鍛えていく1つの案として、Google Guavaのfilterやtransformとかを積極的に使ってみる、とかどうかねぇ。。。?みたいな話をしてました。
例えばですが、以下のようなPersonクラスがあって
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
@AllArgsConstructor
public class Person {
@Getter @Setter
private String name;
@Getter @Setter
private int age;
}
以下のようにリストがあって。
List<Person> listPerson = new ArrayList();
listPerson.add(new Person("堀北真希", 25));
listPerson.add(new Person("有村架純", 21));
listPerson.add(new Person("白石麻衣", 21));
Listから名前だけのリストを作りたい場合とか、今だとベタにforでグルグルと。
List<String> listPersonName = new ArrayList<>();
for(Person person : listPerson){
listPersonName.add(person.getName());
}
一応結果表示すると
System.out.println(listPersonName);
[堀北真希, 有村架純, 白石麻衣]
みたいな。
ただ、Java 8になると、こういう処理はStream API使おうね、って感じで。
先日あったJJUGイベント「祝Java 8 Launch」でも話があったようにJava 8ではforとかwhileをみたら、ちょっと立ち止まって考えてみるような意識していくべきで。
もしJava 8が導入されていれば
List<String> listPersonName =
listPerson.stream().map(p -> p.getName()).collect(Collectors.toList());
とか
List<String> listPersonName =
listPerson.stream().map(Person::getName).collect(Collectors.toList());
とか書けるようになる。
って、あってるかな(^^;汗
今回すごい簡単な例にしてるので、あれですが、こんなのでも慣れが必要だったりするわけで、でもJava 8はまだ現場で使えないし…みたいな。
で、その辺を少し意識的にするために、Java 7でもGoogle Guavaあたり使って
List<String> listPersonName =
Lists.transform(listPerson, new Function<Person, String>(){
@Override
public String apply(Person p) {
return p.getName();
}
});
みたいな書き方をまずはしてみたりとか(^^;
(この例の場合だとforのほうが短くてシンプルにみえちゃいますがそこはおいといて)
Stream APIとは異なるのですが、filterやtransformで意識をちょっとずつ変える感じにチーム皆でトライしてみたりとか。
こうなると、上記コードでわかるように、無名クラスとかインタフェースを結構意識するようにもなって(JavaFXとかだと多様すると思いますが、そうでないと意外と使ってなかったりもするので…人によっては無名クラスって何でしたっけ?というのはあったり…)、関数型インタフェースやラムダへの説明とかがしやすいのかなぁと(^^;
とりあえず、今の開発は少人数体制なので、やってみよっかとか話したり(^^;
ちなみに余談ですが、上記Guavaのコード書いたまま、JDK8にしてみたらNetBeans8が
List<String> listPersonName = Lists.transform(listPerson, p -> p.getName());
List<String> listPersonName = Lists.transform(listPerson, Person::getName);
って書き換えた(^^;笑
わざわざJava 8でGuavaと併用してこんな書き方はしないですが、オチとして。