20210813


今日の勉強内容🏻
  • 就職のためのコードテストCHAPTER 03 GRUDY
    https://github.com/sohee0724/This_is_a_coding_test
  • ジャワ神32章、33章
  • ✍🏻 これは就職のためのコードテストで、CHAPTER 03グリディです.
  • 現在の場合、現在は良い方法のみが選択されている
  • の典型的な階調アルゴリズムは、
  • が最小限の解題構想を考え出すことを要求する.
  • 最良に見えるものを繰り返し選択し、最良の解を見つけることができるかどうか、議論→図面の正当性分析が重要です!
  • の一般的な状況では、グリディが最適な年を保証できないことが多い.しかし,符号化試験におけるグリディ問題は,貪欲法で得られた年が最良の年となった場合に,推定できなければ解決できない
  • である.
  • お釣り問題(p.87)
  • 通貨がKの場合、ソースコードの時間的複雑度はO(K)
  • である.
  • の最大単位のお金を取り戻すのは最良の年を保証する理由です=大きい単位はいつも小さい単位の倍数なので、小さい単位の硬貨を総合して他の年の
  • を得ることができません
    ✍🏻 JAvaの神32章java 8に追加されたのは?
    Optional
  • は、オブジェクト
  • を選択的に処理する.
  • null処理
  • を簡略化することができる.
    public final class Optional<T> extends Object 
    
    // 데이터가 없는 Optional 객체 생성 
    Optional<String> emptyString = Optional.empty()
    // null 추가 
    Optional<String> nullableString = Optional.ofNullable(null);
    // 반드시 데이터가 들어갈 수 있는 상황 
    Optional<String> commonString = Optional.of("common");
    private void getOptionalData(Optional<String> data) 
    						throws Exception {
    	String defaultValue = "default";
    	String result1 = data.get();
    	// 값이 없을 경우 기본값을 지정할 수 있다 
    	String result2 = data.orElse(defaultValue);
    	
    	Supplier<String> stringSupplier = new Supplier<String>(){
    		@Override
    		public String get(){
    			return "GodOfJava";
    		}
    	};
    	String result3 = data.orElseGet(stringSupplier);
    
    	Supplier<Exception> exceptionSupplier = 
        					new Supplier<Exception>(){
    		@Override
    		public  Exception get(){
    			return new Exception(); 
    		}
    	};
    	// 데이터가 없을 경우 예외 발생 
    	String result4 = data.orElseThrow(exceptionSupplier);
    }
    Default method
  • インタフェースはdefault()メソッド
  • を実装することができる.
  • 抽象クラスではextendsを使用する必要がありますが、defaultを使用するインタフェースではimplementsキーワード実装
  • を使用する必要があります.
    public intetface DefaultStaticInterface{
    	String getName();
    	int Since();
    	default String getEMail(){
    		return "[email protected]";
    	}
    }
    日付に関連するクラス
  • java.タイムパッケージを参照
  • ZonedDateTime, LocalDate, DayOfWeek ....
  • 並列ソート
    int[] intValues = new int[10];
    Arrays.parallelSort(intValues);

  • 以前使用していたsort()は単一スレッドとして実行され、ParallelSort()は必要に応じて複数のスレッドに分けて実行される.

  • 性能テストの結果から,5000個以上からParallelSort()の方がsort()よりも性能が速いことが分かる.
    したがって、数の少ないアレイでは、ParallelSort()を使用する必要はありません.
  • StringJoiner
    順序付けされた文字列を処理するための
  • // 배열의 구성요소 사이에 콤마만 넣고자 할 때 
    public void joinStringOnlyComma(){
    	String[] stringArray = 
        		new String[]{"StudyHard", "GodOfJava", "Book"};
    	StringJoiner joiner = new StringJoiner(",");
    	StringJoiner joiner2 = new StringJoiner(",","(",")");
    	for(String string:stringArray){
    		joiner.add(string);
    		joiner2.add(string);
    	}
    	System.out.println(joiner);
    	System.out.println(joiner2);
    }
    
    //출력값
    StudyHard,GodOfJava,Book
    (StudyHard,GodOfJava,Book)
    ✍🏻 JAvaの神33章java 8での変化は?
    Lamda式

  • インタフェースにのみ適用される方法は1つだけです

  • 切り替え可能なRamda式

  • デフォルトramda式
    パラメータリスト|矢印タグ|式
    (int x, int y) → x+y

  • 処理式が1行以上の場合は、カッコで囲むことができます
  • // 이 어노테이션을 사용하면 
    // 인터페이스에는 내용이 없는 하나의 메소드만 선언할 수 있다
    @FuncctionalInterface
    interface Calculate {
    	int operation(int a, int b);
    }
    Calculate cal = (a, b) -> a+b;
    
    // Runnable은 run()메소드 밖에 없기 때문에 람다 표현식 처리 가능
    new Thread(()->{
    	System.out.println("람다");
    }).start();
    
    or 
    
    new Thread(() -> System.out.println("람다")).start();
    java.util.関数パッケージ
    Predicate
  • bolean teat():2つのオブジェクトの比較
  • and(), negate(), or(), inEqual() ...
  • Predicate<String> predicateLength5 = (a) -> a.length()>5;
    Predicate<String> predicateContains = (a) -> a.contains("God");
    Predicate<String> predicateStart = (a) -> a.startsWith("God");
    
    String str = "GodOfJava"
    
    // 데이터가 해당 조건에 맞는지 확인
    predicateLength5.test(str)
    // 데이터가 두개의 조건에 모두 맞는지 확인
    predicateLength5.and(predicateContains).test(str)
    // 데이터가 두개의 조건 중 하나라도 맞는지 확인
    predicateLength5.or(predicateContains).test(str)
    // 데이터가 조건과 다른지 확인
    predicateLength5.negate().test(str)
    Supplier
  • T get()
  • Consumer
  • void accept():タスクの実行および結果の受信なし
  • default Consumer and Then():連続動作用
  • Function
  • R Apply(T):変換が必要な場合にこのインタフェース
  • を使用します.
    UnaryOperator : A unary operator frim T→T
  • R Apply(T):1つのタイプの結果が同じ場合、
  • を使用します.
    BinaryOperator : A binary operator from (T, T) → T
  • R Apply(T,U):同じタイプの結果が得られた場合、
  • が使用されます.
    stream
  • 収集のようなリストを処理するための
  • 構造
  • list.stream().filter(x-> x>10).count()
        스트림생성    중개 연산     종단 연산
    
    - 스트림 생성 : 컬렉션 목록을 스트림 객체로 변환 
    - 중개 연산 : 생성된 스트림 객체를 사용해 중개 연산 부분에서 처리
                 이 부분에서는 아무런 결과를 리턴하지 못한다
                 0개 이상의 중개 연산이 존재 
    - 종단 연산 : 중개 연선에서 작업된 내용을 바탕으로 결과 리턴 
    // 배열 -> 리스트
    Integer[] values = { 1, 3, 5 };
    List<Integer> list = Arrays.stream(values).collect(Collectiors.toList());
    ストリーム配信コンピューティング
  • for Each(ブロック):
  • 、ループを実行するように1つずつポップアップ
  • 地図(マッパー):データを特定のデータに変換する
  • public void printStudentNames(List<StudentDTO> students){
      // student = StudentDTO 객체
      students.stream()
      	.forEach(student -> System.out.println(student.getName()));
    
      // StudentDTO 객체를 사용하는게 아니라 String값 사용 
      students.stream().map(student->student.getNmae())
      		.forEach(name->System.out.println(name));
    }
    メソッド参照=二重コロン(:)
  • タイプ
  • 静的方法
  • 参照
  • 特定のオブジェクトのインスタンスメソッド
  • を参照してください.
  • 特定のタイプの任意のオブジェクトのインスタンスメソッド
  • を参照してください.
  • ジェネレータ
  • を参照
    静的メソッドを参照
    public class MethodReferenceSample {
       MethodReferenceSampel sample = new MethodReferenceSample();
       String[] stringArray = {"요다", "만두", "건빵"};
       sample.staticReference(stringArray);
    } 
    
    public void staticReference(String[] stringArray){
       // of() : 스트림 객체 생성 
       // String의 스트림이기 때문에 forEach() 문장 안에서는 String을 제공
       Stream.of(stringArray).forEach(MethodReferenceSample::printResult);
    }
    
    public static void printResult(String value){
       System.out.println(value);
    }
    特定のオブジェクトを参照するインスタンスメソッド
  • インスタンス参照はシステムです.out::システムクラスに宣言されたout変数(printlnなど)があり、出力変数のprintln()メソッドを呼び出し、「変数に宣言されたメソッドを呼び出す」
  • を表す.
    特定のタイプの任意のオブジェクトを参照するインスタンスメソッド
    private void objectReference(String[] stringArray){
    	// 임의 객체 참조 
    	Arrays.sort(stringArray, String::compareToIgnoreCase);
    	// 인스턴스 메소드 참조 
    	Arrays.asList(stringArray).stream().forEach(System.out::println);
    }
    
    public int compareToIgnoreCase(String str){
    	return CASE_INSENSITIVE_ORDER.compare(this, str);
    }
    ジェネレータを参照
    interface MakeString{
    	String fromBytes(char[] chars);
    }
    
    private void createInstance(){
    	// String 생성자 중에 char[]를 매개 변수로 받는 생성자가 
            // 있기 때문에 이렇게 사용 가능 
    	MakeSring makeString = String::new;
    	char[] chars = {'G','O','D'};
    	String madeString = makeString.fromBytes(chars);
    	System.out.println(madeString);
    }
    Stream map()
    中間変更
  • ストリーム処理の値
  • List<Integer> intList = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
    
    // initList 내용들 모두 x3하기
    intList.stream().forEach(x->System.out.println(x*3)); 
    // map() : 스트림에서 처리하는 값들을 중간에 변경할 수 있다. 
    intList.stream().map(x->x*3).forEach(System.out::println);
    
    //studentList에서 이름만 List로 뽑아 내고 싶을 경우 
    List<StudentDTO> nameList = new ArrayList<>();
    studentList.add(new StudentDTO("요다",43,99,10));
    studentList.add(new StudentDTO("만두",30,49,90));
    studentList.add(new StudentDTO("건빵",32,71,70));
    List<String> nameList = studentList.stream().map(x->x.getName())
      			.collect(Collectors.toList());
    
    Stream filter()
  • 不要なデータまたはWebリクエストのフィルタリング
    private void filterWithScoreForLoop
      		(List<StudentDTO> studentList, int scoreCutLine){
      studentList.stream().filter(student->student.getScore()>scoreCutLine)
      	.forEach(student -> System.out.println(student.getName()));
    }