javaその1

久々にjava
(以下の文章は久々にjavaをやりだした素人が書いているので間に受けないでください)

仕事で使うことになるので慌てて思い出している。
jdk1.4くらいから触ってないからどうなってるのかと思いきや、言語仕様はさほど変わっていない。
総称型が入ったくらい?
その代わりにフレームワーク周りが百花繚乱。
昔もそうだったけど。

言語仕様を変えずにライブラリ、フレームワークでなんとかしようとするのがjavaの流儀なんだろう。
ただ、乗っかるフレームワークを間違えるとこわいことになるから気を付けないと行けない。
strutsでさえ、2への移行はあんまり進んでないようだ。
javaEEで標準のJSFが覇権を取ってるわけでもないのがなんともjavajavaした感じ。

しかし、他の言語からjavaに移るとλ式とか高階関数が無いのがめんどい。ひじょうにめんどい。
高階関数がないせいもあって、リスト操作周りも弱い。ひじょうに弱い。
今のところjava関数型言語の要素は取り入れないでOOPで行きましょう、ということなんだろう。
高階関数がなくてもデザパタでなんとかなるっちゃあなんとかなる(めんどいけど)。
それはそれでいい割り切りなのかもしれない。

以下は復習。

Cls1.java

/**
 *
 */
package test1;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.text.MessageFormat.Field;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Formatter;
import java.util.Iterator;
import java.util.Locale;
import test1.MyEnum;

/**
 * @author xxx
 *
 */
public class Cls1 {

	public interface IFunc<T>{
		T Execute(T s);
	}

	/**
	 * @param args
	 * @throws IOException
	 * @throws ParseException
	 */
	public static void main(String[] args) throws IOException, ParseException {
		//コメント

		//標準出力に吐き出す
		System.out.println("hello world");
		//改行
		System.out.println("hello\nworld");
		//タブ
		System.out.println("hello\tworld");



		//書式付き文字列
		System.out.println(String.format("hello %s", "world"));

		StringBuffer sb = new StringBuffer();
		Formatter fm = new Formatter(sb,Locale.JAPANESE);
		System.out.println(fm.format("hello %s", "world"));

		//関数呼び出し、と言うかメソッド呼び出し
		Cls1 cls1 = new Cls1();
		cls1.hello("xxx");

		//条件分岐
//		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//		String s = br.readLine();
//
//		if(s.equals("aaa")){
//			System.out.println("input aaaa");
//		}else{
//			System.out.println("input not aaa");
//		}

//		int i = Integer.parseInt(br.readLine());
//
//		switch(i){
//			case 1:
//				System.out.println(Integer.toString(i));
//				break;
//			case 2:
//				System.out.println(Integer.toString(i));
//				break;
//			default:
//				System.out.println("othre");
//		}

		//繰り返し
		for(int j=0;j<10;j++){
			System.out.println(Integer.toString(j));
		}

		int k = 0;
		while(k++ < 10){
			System.out.println(String.format("%d", k));
		}

		//intは書けない。でもオートボクシングがあるからintは突っ込める。
		java.util.ArrayList<Integer> arr = new java.util.ArrayList<Integer>();
		arr.add(1);
		arr.add(2);
		arr.add(3);
		Iterator<Integer> itr = arr.iterator();
		while(itr.hasNext()){
			System.out.println(String.format("now %d", itr.next()));
		}

		//for-each
		//構文が若干きもい
		for(int i:arr){
			System.out.println(String.format("now %d", i));
		}

		//昔はなかった定数
		MyEnum em = MyEnum.RED;
		//switchでも使えるよ
		switch(em){
			case RED:
				System.out.println("red");
				break;
			case BULE:
				System.out.println("blue");
				break;
		}

		//クロージャ
		//javaには無いから匿名クラスで代用
		//インターフェース作らないといけないのがメンド
		//無名クラスからは、そのメソッドの final (リードオンリー)
		//なローカル変数を、無名クラスのメンバ変数と名前が被らない限り、参照できる。
		IFunc<String> func = new IFunc<String>(){
			public String Execute(String s){
				return "hello " + s;
			}
		};
		System.out.println(func.Execute("xxx"));

		//λ式。ない。

		//文字列の分解
		String[] strings = "aaa,bbb,eee".split(",");
		for(String s : strings){
			System.out.println(s);
		}

		//文字列検索
		String target = "あいうえお";
		int pos = target.indexOf('う');
		System.out.println(String.format("pos:%d", pos));

		//部分文字列の取得
		String result = target.substring(0,pos);
		System.out.println(result);

		//同値性と同一性
		//同一性は==で比較
		//同値性はequalsで比較。当然クラスではオーバーライドすること。
		Cls2 cls2_1 = new Cls2(1);
		Cls2 cls2_2 = cls2_1;
		Cls2 cls2_3 = new Cls2(1);

		if(cls2_1 == cls2_2){
			System.out.println("同一");
		}else
		{
			System.out.println("同一じゃない");
		}

		if(cls2_1 == cls2_3){
			System.out.println("同一");
		}else
		{
			System.out.println("同一じゃない");
		}

		if(cls2_1.equals(cls2_2)){
			System.out.println("同値");
		}else
		{
			System.out.println("同値じゃない");
		}

		if(cls2_1.equals(cls2_3)){
			System.out.println("同値");
		}else
		{
			System.out.println("同値じゃない");
		}

		//数値ー>文字列
		System.out.println(Integer.toString(1));

		//文字列ー>数値
		String nums = "100";
		int num = Integer.parseInt(nums);
		System.out.println(String.format("num;%d", num));

		//日付ー>文字列

		//現在日時
		Calendar cal = Calendar.getInstance();
		Date dt = cal.getTime();
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd hh:mm:ss.SSS");
		System.out.println(sdf.format(dt));


		//文字列ー>日付
		Date dt2 = sdf.parse("2011/11/11 11:11:11.856");
		System.out.println(sdf.format(dt2));

		//日付計算
		//日付の差を求める
		Date dt3 = sdf.parse("2011/12/24 00:00:00.000");
		long now = dt.getTime();
		long xday = dt3.getTime();
		long span = (xday - now) / (1000 * 60 * 60 * 24);
		System.out.println(String.format("クリスマスまであと%d日", span));
		//日付の加算、減算はカレンダーで
		Calendar cal1 = Calendar.getInstance();
		cal1.setTime(dt3);
		cal1.add(Calendar.DATE, 3);
		System.out.println(sdf.format(cal1.getTime()));
		
		System.out.println("end");
	}
	public void hello(String s){
		System.out.println("hello world " + s);
	}
}

Cls2.java

package test1;

public class Cls2 {
	private int i_;
	public Cls2(int i)
	{
		i_ = i;
	}
	
	@Override
	public boolean equals(Object obj) {
		if(this == obj){
			return true;
		}
		if(!(obj instanceof Cls2)){
			return false;
		}

		Cls2 cls2 = (Cls2)obj;
		return i_ == cls2.i_;
	}
}

MyEnum.java

package test1;

public enum MyEnum {
	RED,BULE,WHITE,BLACK
}