概要編はこちら 🎉祝 Processing4.0 正式版 🚀 - Qiita
Processing4.0になり、ベースのJavaバージョンがJava17へと大幅に進みました(Processing3.5.4はJava8ベース)
今まで使えなかったいろいろなものが使えるようになりました。
すべての言語機能が使えるわけではありません。
3系でもラムダは使えませんでしたし、4.0もswitch式が使えない等PDE側の制限はあります。
現状は使えなくても、徐々に対応が進むと思われます。
新しい組み込み関数もいくつか追加されています。
詳細はこちら Changes in 4.0 · processing/processing4 Wiki
さらに詳細 processing4/revisions.md at main · processing/processing4
Java8
ラムダ式・メソッド参照・関数型インターフェース
import java.util.Arrays;
for (int x : Arrays.asList(1, 2, 3, 4, 5)) {
println(x * x);
}
import java.util.Arrays;
Arrays.asList(1, 2, 3, 4, 5)
.stream()
.map(x -> x * x)
.forEach(PApplet::println);
かえって長い...例が悪いですね。
Java9
List.of
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
List<Integer> list = Arrays.asList(1);
list.set(0, 2);
println(list); // [2]
list = Collections.unmodifiableList(list);
list.set(0, 3); // UnsupportedOperationException
import java.util.List;
List<Integer> list = List.of(1);
list.set(0, 2); // UnsupportedOperationException
変更する気がないなら、List.of
は短くていいですね。
単一アンダースコアのキーワード化
// '_' should not be used as an identifier, since it is a reserved keyword from source level 1.8 on
int _ = 0;
普通は使わないので問題ないでしょう(今後破棄に使えるようになったりするんでしょうか?)
Java10
var(型推論)
int i = 1;
float f = 1f;
String s = "a";
int[] array = { 1, 2, 3 };
HashMap<String, String> map = new HashMap<String, String>();
//HashMap<String, String> map = new HashMap<>(); // ダイアモンド演算子未対応
var i = 1;
var f = 1f;
var s = "a";
//var array = { 1, 2, 3 }; // Array initializer needs an explicit target-type
var array = new int[]{ 1, 2, 3 };
var map = new HashMap<String, String>();
HashMap<String, String> map2 = new HashMap<>(); // ダイアモンド演算子対応
変数の位置がそろって見やすいですね(使えるところはすべて使う派です)
配列初期化子だけは残念です。
Java11
String.strip
println("[" + "\u3000".trim() + "]"); // [ ]
println("[" + "\u3000".strip() + "]"); // []
全角スペースも削除されます。
String.repeat
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
if (j < 9 - i) {
print(" ");
} else {
print("*");
}
}
println();
}
for (int i = 0; i < 10; i++) {
print(" ".repeat(9 - i));
print("*".repeat(i + 1));
println();
}
その文字列を指定回数繰り返した文字列を作ります。
processingで階段を作りたいです | teratail
Java12
String.indent
print("a\n b\n c".indent(2));
println("d");
// a
// b
// c
//d
いつ使いましょうかね。
CompactNumberFormat
import java.text.NumberFormat;
NumberFormat fmt = NumberFormat.getCompactNumberInstance();
println(fmt.format(1000)); // 1,000
println(fmt.format(10000)); // 1万
println(fmt.format(100000)); // 10万
ほしい時もありそうですね。
Java13
JapaneseEra.REIWA
import java.time.chrono.JapaneseDate;
import java.time.format.DateTimeFormatter;
String s = JapaneseDate.now().format(DateTimeFormatter.ofPattern("Gy年M月d日"));
println(s); // 平成34年8月14日
import java.time.chrono.JapaneseDate;
import java.time.format.DateTimeFormatter;
String s = JapaneseDate.now().format(DateTimeFormatter.ofPattern("Gy年M月d日"));
println(s); // 令和4年8月14日
令和も問題ありません。
Java14
残念ながらPDE未対応です。
- caseのカンマ区切り複数ラベル
- switch式
Java15
テキストブロック
String json =
"{\n" +
" \"key\": \"hoge\",\n" +
" \"value\": 1\n" +
"}";
println(json);
//{
// "key": "hoge",
// "value": 1
//}
String json = """
{
"key": "hoge",
"value": 1
}""";
println(json);
//__ ←トリミングされていない!
// {
// "key": "hoge",
// "value": 1
// }
使えはしますが「トリミングされない・自動フォーマットするとずれる」為、まだ実用は無理そうです(よほど"
を大量に使いたい時ぐらいか?)
String.formatted
println(String.format("%s,%d", "a", 1)); // a,1
println("%s,%d".formatted("a", 1)); // a,1
ちょっと短くなりますね。
Java16
Stream.toList
import java.util.List;
import java.util.stream.Collectors;
List<Integer> list = List.of(1, 2, 3, 4, 5);
list = list.stream().map(x -> x * x).toList();
//list.set(0, 0); // UnsupportedOperationException
//list.add(6); // UnsupportedOperationException
println(list); // [1, 4, 9, 16, 25]
list = list.stream().collect(Collectors.toList());
list.set(0, 0);
list.add(6);
println(list); // [0, 4, 9, 16, 25, 6]
「なぜこのタイミングで?」とは思いますが、用途に合っていれば使っていきましょう。
残念ながらPDE未対応です。
- パターンマッチング(instanceof)
- レコードクラス
- 内部クラスにstaticメンバーが定義可能
Java17
HexFormat
color c = color(255, 128, 0);
println("#" + hex(c, 6)); // #FF8000
import java.util.HexFormat;
HexFormat hex = HexFormat.of().withUpperCase();
byte[] bytes = { (byte)255, (byte)128, (byte)0 };
println("#" + hex.formatHex(bytes)); // #FF8000
例は意味がありませんが、便利な時もあるでしょう。
残念ながらPDE未対応です。
- シールクラス
組み込み関数
IntList.random(FloatList・StringList)
IntList list = new IntList();
list.append(1);
list.append(2);
list.append(3);
println(list.get((int)random(list.size())));
// 壊していいなら
list.shuffle();
println(list.get(0));
IntList list = new IntList();
list.append(1);
list.append(2);
list.append(3);
println(list.random());
//println(random(list)); // こうではない
確かに冗長だったが、なぜPApplet.random
にオーバーロードを追加しないのか。
surfaceを置き換える関数
surface.setSize(300, 200);
surface.setResizable(true);
surface.setLocation(200, 200);
surface.setTitle("Processing");
void setup() {
windowResize(300, 200);
windowResizable(true);
windowMove(200, 200);
windowTitle("Processing");
}
void draw() { }
void windowResized() {
println("windowResized", width, height);
}
void windowMoved() {
println("windowMoved", windowX, windowY);
}
そのままですね。
イベントに引数付きはありません。
現在リサイズするとフリーズします。
Freezing on window resize · Issue #507 · processing/processing4