Java と kotlin で android の MainActivity
以下、どちらも Android Studio で自動的に生成されたクラスになります。
Java
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } }
kotlin
class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) } }
継承
kotlin では : (コロン)で継承しているみたいです。何となく変数の型を指定しているように見えますが、class に対してなので。
?
Bundle? のように、型宣言に ? を付けた場合は nullable(null の代入可能) という意味になるようです。
kotlin は明示的に ? を付けないと、null を代入できないようです。
Java challenge Optional
なにが出力されるのか?
public static void main(String[] args){ List<String> list = Arrays.asList("X", "Zero", "Sigma", "Willy"); Optional<String> op = list.stream().findFirst(); Optional<String> op2 = list.stream().filter(e -> e.equals("Signa")).findAny(); System.out.println(op.orElse("")); System.out.println(op2.orElse("Double")); }
考察
一つ目の Optional op は、最初の要素だけ取得するから、"X" が入っているはず。
二つ目の Optional op2 は、"Signa" を探しているけど、該当する要素はないので、何も入っていないはず。
なので、出力は
X
Double(null に対して orElse の中身が出力される)
となるはず。
結果
X
Double
各メソッドは基本的なもので、戻り値(動作)が分かっていれば特に問題はなさそうです。
Java challenge methodReference
なにが出力される?
public static void main(String[] args) { List<String> castlevania = new ArrayList<>(); castlevania.add("Dracula"); castlevania.add("Alucard"); castlevania.add("Trevor"); List<String> castlevaniaResult = new ArrayList<>(); Consumer<String> c1 = System.out::println; Consumer<String> c2 = castlevaniaResult::add; Consumer<String> c3 = c -> castlevaniaResult.removeIf(e -> e.matches("Trevor")); castlevania.forEach(c2.andThen(c1).andThen(c3)); System.out.println(castlevaniaResult); }
考察
Consumer が初見だったので調べてみたところ、”引数を消費するインスタンスを定義するためのインターフェイス”とのこと。
castlevania.forEach で最初に c2 に引数が渡されていることになるので、
まず、castlevaniaResult に castlevania の全ての要素が格納されることになるはず。
次に, c1 に引数が渡されるので、全ての要素がここでまず出力されるはず。
Dracula
Alucard
Trevor
そして、c3 に引数が渡されるので、castlevaniaResult から Trevor が除外されるはず。
最後に castlevaniaResult を出力しているので、以下の2つの要素が出力されるはず。
Dracula
Alucard
結果
Dracula
Alucard
Trevor
[Dracula, Alucard]
最後は、List
Consumer とか、Java8 から登場した関数型のインタフェースみたいですが、Java8 の基礎みたいなので、別で調査してみたいです。
Java challenge MethodReference
なにが出力される?
public static void main(String[] args) { List<Homer> homers = new ArrayList<>(); homers.add(new Homer()); homers.add(new Homer()); homers.add(new Homer()); homers.removeIf(e -> e.talk.equals("D'oh")); homers.forEach(System.out::println); } static class Homer { String talk = "D'oh!"; public String toString() { return talk; } }
考察
homers に3つの Homer インスタンスが格納された後、talk の内容を比較しているが、いずれも一致しないので除外はされないはず。
その後、println() にインスタンスを渡しただけで、toString() が呼び出される?とすれば、 D'oh! が3つ出力されるはず。
結果
D'oh!
D'oh!
D'oh!
println()メソッドが、渡されたインスタンスのtoString()メソッドを呼び出すということ。
割と基本的なことだったみたいですが、toString() を明示的に書くようにしていたので、勉強になりました。
Java challenge thread with lamda
何が出力されるのか?
public static void main(String[] args) throws InterruptedException { Runnable r = () -> { for(int i = 0; i <= 10000; i++) { System.out.println(i); } System.out.println("Running!"); }; Thread thread = new Thread(r); thread.start(); thread.join(); }
考察
Runnable r の定義が見慣れないのですが。
単純に考えると、つくられたスレッドの中で、i が 0 から 10000 まで出力された後、"Running!"が出力されて終わる気がします。
結果
0
1
2
3
....
9998
9999
10000
Running!
期待していた通りの出力でした。
たぶん、このチャレンジの意図は、Runnable r の定義の仕方なのかなと思います。
lamda であればこんな風に書けますよみたいな。
以下の記事のように、Runnable interface を実装する方法と比較すると、lamda を使った方が断然簡単に書けますね。
blueskyarea.hatenablog.com
Java challenge ListRemoveIf
何が出力されるのか?
public class ListRemoveIf { public static void main(String[] args) { List<Integer> list = new ArrayList<>(); list.add(22); list.add(23); list.add(10); list.add(12); list.add(13); list.add(0); list.removeIf(e -> e == new Integer(12) || e.equals(new Integer(22))); System.out.println(list); } }
考察
これは、リストの要素を1つずつチェックして、もし12か22であれば、それを取り除こうとしているように見える。
でも、オブジェクト型(Integer)は == で比較は出来ないから、22だけが取り除かれると思われる。
結果
[23, 10, 12, 13, 0]
22だけが除外されました。
もし e == new Integer(12) の部分が e == 12 だったらどうなるか?
[23, 10, 13, 0]
結果は 12 も除外されました。
"-128から127"までの間の数値は、java内部で同一オブジェクトが使われるから、オブジェクトとして等しいという結果になっているようです。
Java challenge Interface
問題:何が出力されるのか?
public class BigBangTheory { public static void main(String[] args) { Scientist scientist = new Sheldon() { search() { System.out.println("This is my new spot!"); } }; scientist.search(); } interface Scientist { void search(); } static class Sheldon implements Scientist { void search() { System.out.println("This is my spot."); } } }
考え
Sheldon のインスタンス生成時に、search() をオーバーライドしているのだから
「This is my new spot!」と表示されるはず。
答え
コンパイルエラー。。理由↓
1. Sheldon クラス内の search() メソッドのアクセス修飾子の可視性が下がってしまっている。 public -> 指定なし
2. Sheldon のインスタンス生成時における search() メソッドに戻り値の型が指定されていない。
インターフェースのメンバは暗黙的に public になることと、文法の誤りに気付くかどうかですね。
コンパイル通るようにしたら、「This is my new spot!」が表示されました。