社内se × プログラマ × ビッグデータ

プログラミングなどITに興味があります。

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 が System.out.println の引数に渡されていたので、リスト形式で出力されるのを失念してしまいました。
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!」が表示されました。