| ページ一覧 | ブログ | twitter |  書式 | 書式(表) |

MyMemoWiki

差分

ナビゲーションに移動 検索に移動
5,062 バイト追加 、 2020年4月16日 (木) 16:25
==[[言語まとめ Java]]==[[言語 まとめ]] | [[Java]]| {{amazon|4798151122}}
===準備===
====参照サイト====
*JDK6 ドキュメント http://java.sun.com/javase/ja/6/docs/ja/
*Java言語規定 [[Java]]言語規定 第三版 http://java.sun.com/docs/books/jls/third_edition/html/j3TOC.html
====環境====
*[http://java.sun.com/javase/ja/6/ Java SE]
**[http://java.sun.com/javase/ja/6/ ランタイム、コンパイラ]を入手
===言語基本[[言語]]基本===
====データ型====
=====データ型=====
!演算子
!内容
|-|<nowiki>++ --</nowiki>
|インクリメント、デクリメント
|-|<nowiki>+ - * /</nowiki>
|単項 加算、減算、乗算、除算
|-
|-
|& ^ |
|ビット演算子 AND XOR ORXO[[R]] O[[R]]
|-
|<nowiki>&& ||</nowiki>
|ブール演算用ショートサーキット
|-
|-
|}
 
====制御====
=====順次=====
=====クラス=====
*継承
====ラムダ式====
*Java8以降では、メソッドも型の一つ
*メソッドを引数として渡すこともできる。
**引数の型と数、戻り値の型が同一であるメソッド参照を渡せるようになる
*その仕組みが、メソッド参照であり、ラムダ式
=====メソッド参照=====
public class MethodRef {
public static void main(String[] args) {
// メソッド参照による引き渡し
writeLine("Quote test.", MethodRef::quote);
writeLine("Indent test.", MethodRef::indent);
}
private static void writeLine(String line, Converter converter) {
System.out.println(converter.covert(line));
}
/** Converter型に対応したメソッド */
public static String quote(String value) {
return String.format("\"%s\"", value);
}
/** Converter型に対応したメソッド */
public static String indent(String value) {
return String.format("\t%s", value);
}
/** Stringを受け取りStringを返すメソッド型 */
@FunctionalInterface
public interface Converter {
String covert(String value);
}
}
*結果
"Quote test."
Indent test.
 
=====ラムダ式基本=====
*上記のメソッド参照の例では、writeLineメソッドに引き渡すためだけに、quoteおよびindentメソッドを定義している
*その場限りの利用の場合、メソッド定義を式として表すことができるラムダ式を利用できる
(引数型 仮引数) -> {
メソッド本体
}
*メソッド参照を使用して書いたコードをラムダで書き換え
public class Lambda {
public static void main(String[] args) {
writeLine("Quote test.", (String value) -> {
return String.format("\"%s\"", value);
});
writeLine("Indent test.", (String value) -> {
return String.format("\t%s", value);
});
}
private static void writeLine(String line, Converter converter) {
System.out.println(converter.covert(line));
}
/** Stringを受け取りStringを返すメソッド型 */
@FunctionalInterface
public interface Converter {
String covert(String value);
}
}
=====java.util.function関数型インターフェース=====
*関数インターフェースを上記では自作したが、java.util.function パッケージで提供されている1
{|class="wikitable"
!名称!!内容
|-
|Consumer||値を返さない。処理のみ。
|-
|Supplier||値を返す。引数なし。
|-
|Function||値を返す。引数あり。
|-
|Predicate||真偽値を返す。引数あり。
|-
|BinaryOperator||演算結果を返す。引数2つあり。
|-
|UnaryOperator||演算結果を返す。引数1つ。
|}
 
import java.util.function.*;
public class BuildInFuncInf {
public static void main(String[] args) {
String[] num = {"1","2","3"};
printFunc(num, (value) -> Integer.parseInt(value) * 10 );
printFunc(num, (value) -> (int)Math.pow(Integer.parseInt(value),2) );
}
/**
* Stringを引数にとり、Integerを返す関数インターフェース
*/
public static void printFunc(String[] params, Function<String, Integer> func) {
for(String param : params) {
System.out.println(String.format("%d", func.apply(param)));
}
}
}
*実行結果
10
20
30
1
4
9
 
=====ラムダ式の簡単化=====
*本体が一文である場合、{}を省略できる
*文の戻り値が暗黙的に戻り値とみなされる
*引数型は暗黙で類推されるので省略するのが一般的
*引数が1つの場合、くくるかっこも省略できる
*引数がない場合はかっこを省略できない
=====ラムダ式を伴うコレクションのメソッド=====
{|class="wikitable"
!メソッド!!内容
|-
|replaceAll||指定されたルールで置き換え
|-
|removeIf||合致した要素を削除
|-
|compute/comuteIfPresent/comupteIfAbsent||マップに処理の結果を設定
|-
|merge||重複したキーの値を加工
|}
*replaceAll
var list = Arrays.asList("0,1,2", "3,4,5", "6,7,8")
list.replaceAll(v -> v.replace(',','-'));
System.out.println("replaceAll : " + list);
 
replaceAll : [0-1-2, 3-4-5, 6-7-8]
 
*compute
var map = new HashMap<String, String>(Map.of(
"1", "a",
"2", "b",
"3", "c"));
map.compute("2", (k,v) -> k + v);
System.out.println(map);
 
{1=a, 2=2b, 3=c}
 
===Stream API===
*コレクションなどのデータソースから繰り返し処理をStreamに引き渡す
*処理の流れは
#ストリーム生成
#中間処理:抽出、加工
#終端処理:出力、集計
 
var list = Arrays.asList(0,1,2,3,4,5);
list.stream()
.filter(num -> num % 2 == 0)
.map(num -> (int)Math.pow(num, 2))
.forEach(System.out::println);
 
0
4
16
====ファイル====
=====ファイルを読む=====
=====ファイルに書く=====

案内メニュー