概要(お前は何を言っているんだ) コードレビューしていると、__Java8のfeature(Stream APIとかOptionalとか)を使ってるんだけど、Java7以前と大差ない書き方をされているコード__をよく見かける。 もっと皆に__Java8っぽいコード__を書いて欲しい。そうじゃないともったいない。 (*"Java8っぽい"の基準は割りと(かなり?)私見が入っている) 言葉を尽くしても伝わりづらいので、例を作ろう。 ← これ ついでに、「無理してJava8のfeature使うことで、逆に悪くなってしまっている例」も作ろう。 対象読者 Java8でコード書いてるけど、Java7以前の書き方が染み付いちゃっていてなかなか抜け出せない人 「forやnullチェックは絶対使うべきでない」という思いが強すぎて、何でもかんでもStream APIやOptional使ってる人 Notice
前回、Stream の裏舞台について見てみました。 blog1.mammb.com ついでなので、今回は Lambda 式の裏舞台について見てみましょう。 はじめに 有名な話ではありますが、以下の匿名クラスを含むコードをコンパイルすると、2つのクラスファイルが生成されます。 public class Main { public static void main(String... args) { Logger.getGlobal().info(new Supplier<String>() { @Override public String get() { return "hello"; } }); } } 以下のようなクラスファイルになります。 Main.class Main$1.class では、lambdaで書いた場合はどうなるでしょう。 public class Main { pub
Java9 も出た昨今でいまさらですが、Stream パイプラインが裏でどのように動いているのかをコードを交えて紹介します。 以下の単純な例を元に、内部処理を追っていきましょう。 Arrays.asList("a", "b", "c") .stream() // (1) Stream の生成 .filter(String::isEmpty) // (2) パイプライン .forEach(System.out::print); // (3) 終端処理 (1) Stream の生成 (2) パイプライン (3) 終端処理 まとめ (1) Stream の生成 最初はストリームを取得する stream() の中身から見ていきます。 stream() は Collection インターフェースのデフォルトメソッドとして以下のように定義されています。 public interface Collect
13. 周波数解析する ● 時間ごとの周波数解析を行う ● フーリエ変換 – データ全体の周波数解析を行う – 三角関数で畳み込む ● 窓関数付きフーリエ変換 – 時間ごとにデータを切り出して フーリエ変換を行う ● ウェーブレット変換 – 短く切り出した三角関数などを使って 畳み込む – 処理も簡単 http://d.hatena.ne.jp/nowokay/20161227 ※畳み込み zip(data1, data2) .map((a, b) -> a * b) .sum() 14. 離散ウェーブレット変換 ● 隣同士を引いて2で割る – 移動差分 – ハイパスフィルタになる(高い周波数だけ残す) – ウェーブレット値 ● 隣同士を足して2で割る – 移動平均 – ローパスフィルタになる(低い周波数だけ残す) – より低い周波数の解析に使う
Java8 の目立たない変更として、Math クラスにオーバーフロー時には例外を投げるExact (正確な) 系メソッドが追加された。 いずれも int または long を引数に取るようにオーバーロードされている。 算術演算の結果がオーバフローする場合には ArithmeticException がスローされる。 加算、減算、乗算 addExact Integer r = 2_147_483_647 + 1; // -2147483648 Math.addExact(2_147_483_647, 1); // ArithmeticException subtractExact Integer r = -2_147_483_648 - 1; // 2147483647 Math.subtractExact(-2_147_483_647, 1); // ArithmeticException
[Java8][Framework] New Next Web Framework 「Jooby」入門 [Lifecycle] はじめに 前回は手始めにHelloWorldでアプリケーションを起動してみました。今回から少しずつFrameworkの動作について確認していきます。今回は基本的な部分であるアプリケーションライフサイクル、アプリケーション設定、ログについて確認します。 前回と同じくJava8とMaven3が最低必須条件です。自分の環境は以下の通り。 Java(TM) SE Runtime Environment (build 1.8.0_91-b14) Apache Maven 3.3.9 Joobyのバージョンは以下で試しています。 1.0.0.CR7 もたもたしていたらCR7が出てしまいました。 Start, Stopイベント アプリケーション及びモジュールはそれぞれ、 sta
Java 8からこういう書き方が出来るようになっていたようです。(初めて知った) public class Main { public String getString(Main this) { // thisで自分自身が引数になっている return this.toString(); } public static void main(String[] args) { Main main = new Main(); System.out.println(main.getString()); //呼び出すときは何も書かなくてもよい } } 何がうれしいかというと、自分自身を呼び出すときにアノテーションがつけれるようになる。(そして処理が出来るようになる) なんか、おおっ!という感じ。 呼び出すときに何も書かなくてよいというのがものすごくJavaっぽくないので驚きました。 http://bl
Java8 ではラムダ式やストリーム API に注目が集まってますが、何気にアノテーションに関しても機能拡張がされているようなので簡単な変更点や使い方を今夜試してみました。 ElementType の追加 TYPE_PARAMETER TYPE_USE 定義済みアノテーション @Repeatable アノテーション @FunctionalInterface アノテーション @Native アノテーション 目次 ラムダ式やストリーム API や新しい日時 API だけじゃない! Java8 のタイプ・アノテーションあの手この手 どんとこいタイプ・アノテーション! Checker Framework 導入あの手この手 ~without IDE 編~ どんとこいタイプ・アノテーション! IntelliJ IDE 独自のタイプ・アノテーション 参考 InfoQ 「Type Annotations
##はじめに Java8の新機能、Stream APIを使い始めてコーディングが格段に楽になりました。 備忘録的にサンプルコードを書き出してみました。少しずつ追加していく予定です。 Javaは使ったことあるけどラムダ式やStream APIはよく知らないという方は、参考にしてみてください。 バリバリ使っている方は、こんな使い方もあるよ!と教えていただけると嬉しいです。 ちなみにオライリー社のJavaによる関数型プログラミング ―Java 8ラムダ式とStreamがとても参考になりました。 【前提条件】Stream APIの説明に使用するオブジェクト public class Person { private String name; private int age; private List<Person> children; public Person(String name){/*..
単独のJavaプログラムを起動するには、staticなmainメソッドを持つクラスをjavaコマンドに指定します。 public class Hello { public static void main(String... args) { System.out.println("Hello, world"); } } ~$ java Hello Hello, world ~$ところが、JDK 8でJavaFXアプリケーションを作った場合、mainメソッドがないのに実行できてしまいます。 import javafx.application.Application; import javafx.stage.Stage; public class HelloFx extends Application { @Override public void start(Stage stage) { s
今回も前回の記事につづき、Java8による変更点で未だあまり紹介されていないポイントを記事にしようと思う。 今回はJava8のHotSpotVMの話。Java8ではJEP122が取り込まれ、VMのメモリモデルが変更された。JEP122のタイトル「Remove the Permanent Generation」から想像できるとおり、Java8のHotSpotVMからは従来のPermanent領域が無くなった。 なぜ、こういった変更が行われたのだろうか?また、元々Permanent領域に格納されていた情報は何処にいってしまったのか?JVM付属のツールにどういった影響があるのか? 今回の記事ではこの点をまとめていこうと思う。 なお、HotSpotVMのメモリモデルについて詳しくない方は、先にこちらの項番(「補足 – HotSpotVMのメモリ構造概説)を読んでいただくとスムーズに読み進められるだ
最近ぼちぼちJavaをやり始めたところタイミング良くJava8がリリースされたので新機能であるラムダ式について少し見ていこうと思います. まず,Java8におけるラムダ式は一体何なのかというと,それはずばり抽象メソッドを一つだけ持つインタフェースのインスタンスです.例えば以下のようなインタフェースがあったとして, public interface IntFunc{ public int func(int x); } 従来では IntFunc f1 = new IntFunc(){ @Override public int func(int x){ return x*x; } }; と書いていたのがラムダ式によって IntFunc f2 = (int x) -> {return x*x;}; と書けるようになります.実際には型および引数が一つの場合は括弧,return文のみの場合はretur
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く