【JavaScript】指定した文字数のランダムな英数字文字列を生成する
備忘録がてら。
以下のプログラムは200文字のランダムな英数字文字列を生成する。
例: test.js
let length = 200; // わかりやすく代入しているが、直指定すればワンライナーで書ける。 let str = Array.from({"length": length}, (v, k) => k) .map(e => Math.random()) .map(e => e.toString(32)) .map(e => e.substring(2)) .map(e => e[0]) .join(''); console.log(str); // 5vs1p7cs56obf6h6qq19kp3sdeo4a94io4iev4b4rc8fu745rlap9n69h3324qr90mari3jr287o744pervirflvhgrsm7oa4ps85u16k86ch3nn725de9quvvj89lhph6mdhn72aob9fc0kq4avo4rdo02tfpr7905d86t4f96qlslhbdk92e7if4vf526h27pp722t
何に使えるかといえば、大量のテストデータの生成など。
このプログラムの周りにループなどをかましてやれば、大量に無作為な英数字文字列を生成することができる。
またバリデーションのテストなんかで、文字数の限界値チェック用の値に使える。
【Java】[java.util.Optional]における匿名クラスの扱いに気をつけよう
Javaの話。
※ Java8及びJava15にて事象を確認。
以下のプログラム(Test1.java)はコンパイルエラーが発生する。
例: Test1.java
import java.util.Optional; public class Test1 { public static void main(String... args) { Object object = Optional.of(new Object(){}) .orElse(new Object()); } }
# javac Test.java Test.java:6: error: incompatible types: Object cannot be converted to <anonymous Object> .orElse(new Object()); ^
これは極端な例だが、取得するインスタンスのクラスがObjectクラスを拡張した匿名クラス、[Optional.orElse()]の引数がObjectクラスのインスタンスで、それぞれクラスが食い違っているために発生する。
これは[java.util.Optional.map()]を経た場合においても発生するので、実際にあり得そうな例としてはmap内で何かのクラス(例えばA)の匿名クラスインスタンスを生成し、[java.util.Optional.orElse()]には単純なAのインスタンスを指定した場合に発生しうると考えられる。
ただ、エラーメッセージが若干わかりにくいために遭遇すると困惑するかもしれない。
単純な解決方法としては[java.util.Optional.map()]にてキャストを挟めば良い。
例: Test2.java
import java.util.Optional; public class Test2 { public static void main(String... args) { Object object = Optional.of(new Object(){}) .map(Object.class::cast) .orElse(new Object()); } }