2014/06/06

java8 1.8

最近、人気のスクリプト言語の特性を取り込む感じね。。


★ラムダ式
List<String> list = Arrays.asList("Java", "Scala", "Groovy");
list.sort((s1, s2) -> s1.length() - s2.length());

list.forEach(s->System.out.println(s));


★関数型インタフェース

@FunctionalInterface
public interface TriFunction {
    public int apply(int a, int b, int c);
}

==>使うところで、

TriFunction functionSum = (a, b, c) -> a + b + c;
TriFunction functionMulti = (a, b, c) -> a * b * c;

int sumResult = functionSum.apply(1, 2, 3);
int multiResult = functionMulti.apply(1, 2, 3);


==>あれ、あまりメリットないかな。。。。
OOBの視点から。。



public static Function<Integer, String> repeater(String value) {
        return (times) -> {
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < times; i++) {
                sb.append(value);
            }
            return sb.toString();
        };
    };
   
String values = repeater("Soft").apply(20);

==>なにこれ、まさにことばの遊びだね。。
まぁ。。仕方がない。世の中にそれが好きな人がたくさんいるから。。。
覚えなきゃ。。コミュー



Java 8では宣言時に値が代入され、以降変更されていない変数を実質的にfinalとみなすことができるようになっている

★インタフェースのデフォルト実装
public interface HelloWorld {
  default public String hello(String name) {
    return "Hello " + name;
  }
}
===>はぁ。。これはね。。。前も解決できない問題ではない。。。。
クラスを使う。。。。
==>あれ、そういえば、インタフェースとクラスの区別が曖昧になる?
良くないと思う。
javaはスクリプト言語じゃないから。。
大規模な開発で、スクリプト言語はなんとなく貧弱と思う。

・正:システムというのは積み木のようなもの。問題が起こるとしたら組み合わせの問題だろう。これまで楽天では工夫してシステムを積み上げていったので、PHPの大規模
開発も問題なく成り立っている。
開発期間が短くて済むため、数カ月単位で環境が変わってしまうインターネット業界に適している。PHPは早くて安くてできないことはほぼないと言ってよいだろう。
==>早いね。システム開発は積み木。モジュールの考え方ね。
・反:PHPではやろうと思えばスクリプト中でなんでも出来るため、他の人が引き継げなくなる恐れが大きい。また、1人~3人程度で開発している分には良いのだが、複数人数での開発は厳しい。へたをすると、ロジックとプレゼンテーションを切り分けるという大原則さえ簡単に破られる。(そんなこと気にしたことない人は、これを機会に考えてください。)小規模で十分シンプルなサービスなら適用できるというのが私の考えだ。
==>やはり、メテン性をあげた。。だが、重要のは、よいシステムの設計は、思想がないとだねだね。。
現実世界の事を分析して、実現だけではなく、生き物のように柔軟に設計する事は、スクリプト言語は難しいね。

うん、スクリプト言語は行動、実現を最優先にするね、
java8をその特長を取り入れ、悪いことじゃない。。。。時代のリクエスト、仕方がない。


★コレクションメリット
list.removeIf()
map.putIfAbsent()
map.replace()
map.merge()
map.computeIfPresent("A", (key, value) -> value * 3);
map.computeIfAbsent("A", (key) -> LocalDate.now().getYear());


並列ソート、Fork / Join Framework?
int[] array = ...
Arrays.parallelSort(array);


★java.util.stream.Stream
==>先頭の要素から順に遅延評価されるリスト
Streamに対する処理はメソッドチェーンで呼び出すことができる

★LocalDateTime
  LocalDate
  LocatTime

★java.util.Optional
==>Optionalを使用することで「値が存在しないかもしれない」ということを明示することができ、nullチェックをわすれてしまうといった単純なミスを防止することができる。


★java.util.concurrent.locks.StampedLock
==>マルチスレッド環境下でもロックをせずに一貫性のある読み取り処理を行う「楽観的読み取り」を実現するもの
リードロックの取得コストが不要になるのはもちろんのこと、リードロックによって書き込み処理がブロックされることがなくなるため読み取り・書き込み双方の高速化が期待できる。

・Comparator<String> c=(x,y) -> x.length()-y.length();
==>必要な部分だけ記述して良い。。

・ループ処理を並列化するには、「内部イテレータ」を導入する方法がある
SomeCoolList<Student> students=.....

double highestScore = students.filter(
new Predicate<Student>
    {
        public boolean op(Students){
            return s.getGradYear(()=2001;
        }
    }
).map(
    new Mapper<Student,Double>(){
       
    }
).max();


=->
int highestScore=
students.filter(s->s.getGradYear()==2001).map(s->s.getScore()).max();

int highestScore=
students.paraller().filter(s->s.getGradYear()==2001).map(s->s.getScore()).max();
==>これは、ランダム式導入の本来の目的?


★Project Jigsaw: Putting it Together

・JARはjavaの初期段階で作った仕組みなので、色んなもんだいを直面している:

    「JAR地獄」の解消
    クラスパス指定の必要をなくす
    ライブラリの依存関係をソースコードに記述できるように
    必要なモジュールを自動でダウンロード・インストールできるように
    Javaプラットフォームのスケーラビリティの向上
    小さなデバイスにも適用可能なJava SEのサブセットを作れるようにする
    パフォーマンスの改善
    ダウンロード時間や起動時間を改善する