TIL 2021.02.23


🧐 TIL (Today I Learned)


1. Try with Resources


Try with Resourcesはjava 7のサポートであり、try blockにリソースを宣言するときにblockの実行後にリソースが終了することを保証します.tryカッコ内で宣言されたオブジェクトが自動再利用可能である場合、try構文の終了時にオブジェクトのclose()メソッドが呼び出されます.

使用方法

// 코드 1

try (PrintWriter writer = new PrintWriter(new File("test.txt"))) {
    writer.println("Hello World");
}
簡単に言えば、tryカッコ内で同時に宣言と初期化が終了します.

Try with Resourcesが現れる前に?

// 코드 2

Scanner scanner = null;
try {
    scanner = new Scanner(new File("test.txt"));
    while (scanner.hasNext()) {
        System.out.println(scanner.nextLine());
    }
} catch (FileNotFoundException e) {
    e.printStackTrace();
} finally {
    if (scanner != null) {
        scanner.close();
    }
}
このようにtry-catch-finally文を使用して、最後にスキャナを常に閉じるようにします.
どこでこの過程で資源に関する問題を聞いたのか分かりません.あると聞きましたが、まだ勉強しなければなりません.

Try with Resourcesができてから

// 코드 3

try (Scanner scanner = new Scanner(new File("test.txt"))) {
    while (scanner.hasNext()) {
        System.out.println(scanner.nextLine());
    }
} catch (FileNotFoundException fnfe) {
    fnfe.printStackTrace();
}
코드 2と違ってfinallyはなくcatchだけでいいです.

同時に宣言可能

try (
    Scanner scanner = new Scanner(new File("testRead.txt"));
    PrintWriter writer = new PrintWriter(new File("testWrite.txt"))
    ) {
    while (scanner.hasNext()) {
	writer.print(scanner.nextLine());
    }
}
tryカッコ内で;セミコロンで区切るといいです.
リファレンス
Java – Try with Resources Java Try-with-resourcesを使用してリソースを簡単に解放

2.タスクPRが上手VS上手に読めない


今朝、私たちはヒロ、ウディ、テリーのPRを見ました.任務の要求に従って書いたコードかどうか分かりませんが、私もそう書いたので、ついでに読んだだけです.ウディガンは自分のやり方でたくさん作ったようなので、読むのに時間がかかりました.コードをたくさん読ませるという意味で、初めて見た構造をもっと読ませるという意味ですよね?では、パロのコードを知らずに後回しにするのではなく、理解しようと努力したときに読んだほうがいいのではないでしょうか.
おなじみのコードよりウディがパイと一緒に見慣れないコードを見に行こうと努力しているのかな(?)

3.ラム茶の作り方を知る前に


ランダが必要とする理由


ラムダ式は実行に伝達できるコードブロックである.
元のコードブロックがある場合は、まずオブジェクトを作成する必要があります.すなわち、クラスを作成し、メソッドにコードブロックを含める必要があります.
しかしjava 8からramda式があれば,この関数を方法のパラメータとして得ることができる.

Java 8以前のSorting

// 코드 1

public class Dog {
	String name;
	int height;
	int weight;
 
	public Dog(String n, int s, int w) {
		this.name = n;
		this.height = s;
		this.weight = w;
	}
 
	public String toString() {
		return getName() + ": size=" + getHeight() + " weight=" + getWeight()
				+ " \n";
	}
 
	//setters and getters ... 
}
코드 1のようなDogクラスがあります.
// 코드 2

public class ArraysSort {
 
	public static void main(String[] args) {
		Dog d1 = new Dog("Max", 2, 50);
		Dog d2 = new Dog("Rocky", 1, 30);
		Dog d3 = new Dog("Bear", 3, 40);
 
		Dog[] dogArray = { d1, d2, d3 };
		printDogs(dogArray);
 
		Arrays.sort(dogArray, new Comparator<Dog>() {
			@Override
			public int compare(Dog o1, Dog o2) {
				return o1.getWeight() - o2.getWeight();
			}
		});
		printDogs(dogArray);
	}
 
	public static void printDogs(Dog[] dogs) {
		System.out.println("--Dog List--");
		for (Dog d : dogs)
			System.out.print(d);
		System.out.println();
	}
}
次に、코드 2からdogArrayに並べ替えるには、Arrays.sort()を使用します.2番目のパラメータはcomparatorで、comparatorを定義する必要があります.

Java 8 ramマルチフォーマットによるSorting

// 코드 3

Arrays.sort(dogArray, (Dog m, Dog n) -> m.getWeight() - n.getWeight());
printDogs(dogArray);
ランダ式に置き換えると、코드 3のようにコードを非常に簡潔に生成することができる.
リファレンス
Why do we need Lambda in Java?

4.学習オプションの前に


the dangers of null


nullリファレンスは、値がないことを表すためによく使用されるため、多くの問題の根源です.
トニー・ホアというコンピューター科学者がnull参照を開発したという.
"I call it my billion-dollar mistake. It was the invention of the null reference in 1965. I couldn't resist the temptation to put in a null reference, simply because it was so easy to implement."
  • トニー・ホールの謝罪
  • この問題を軽減できるのはjava 8のjava.util.Optionalからです.
    例えば、Computerのオブジェクト構造は、以下のように仮定される.
    String version = computer.getSoundcard().getUSB().getVersion();上のコードで発生する可能性のある問題は何ですか?一見問題ない.
    しかし、一部のパソコンにはサウンドカードがないかもしれません.
    では、getSoundcar()の結果はどうなるのでしょうか.
    通常はnullリファレンスを返し、サウンドカードがないことを示します.
    言い換えれば、getUSB()がnull参照のUSBを戻そうとしていることを意味する.
    したがって、実行時にはNullPointerExceptionが表示され、これは、プログラムが実行時に停止することを意味する.
    現在の状況では、このような予想外のNullPointerceptionを避けるにはどうすればいいのでしょうか.
    String version = "UNKNOWN";
    if(computer != null){
      Soundcard soundcard = computer.getSoundcard();
      if(soundcard != null){
        USB usb = soundcard.getUSB();
        if(usb != null){
          version = usb.getVersion();
        }
      }
    }
    上記のコードの問題は、条件文が重複してコードが乱れていることです.プログラムコードの可読性は全体的に低下する.
    そして、これは間違いやすいプロセスです.このように処理すればいいのですが、ある属性がnullであることを忘れたらどうなりますか?
    したがってnull自体を使うのは危険であり、望ましくない.
    ここで必要なのは、値があるかどうかというより良いモデリング方法です.
    リファレンス
    Tired of Null Pointer Exceptions? Consider Using Java SE 8's "Optional"!

    に感銘を与える


    今日はクーパーpr Characterを読んでtoUpperCaseを利用して表示を管理することで、私のコードを簡潔に変更できると思います.結果はちょうどタスク5に現れます.