Java 8은 몇 년 동안 대기 한 후에 Java에서 기능적 프로그래밍을 지원할 수 있으며 Java에 대한 가장 중요한 기능은 Java 프로그래머에 대한 강력한 기능을 제공합니다. 데이터베이스를 작동하면 기능적인 프로그래밍이 흥미롭고 간단하고 효율적인 데이터베이스 API를 제공합니다.
데이터 처리의 기능적 방법
Java 8은 기능적 지원을 추가 할뿐만 아니라 새로운 기능 처리 데이터를 통해 수집 클래스를 확장합니다.
예를 들어, 컬렉션 컬렉션이 있다고 가정합니다. 고객 : 고객 :
컬렉션 <sulfort> 고객;
벨기에의 고객에게만 관심이있는 경우 모든 고객 객체를 발끝으로 만들고 필요한 것을 저장해야합니다.
Collection <customerians = New ArrayList <() (Customer C : Customer) {if (C.getCountry ().이것은 5 줄의 코드뿐만 아니라 1 천만 개의 객체를 사용하여 모든 객체를 필터링하면 많은 위험한 위험을 사용해야합니다. 모든 코드를 다시 작성하려면 스레드 코드.
Java 8을 사용하면 한 줄의 코드 만 기능적 프로그래밍을 지원함으로써 Java 8을 사용하여 해당 기능을 사용하여 해당 기능을 사용하여 세트를 설정할 수 있습니다. 여과하십시오. Java 8의 새로운 Steams API는 다음을 수행하도록 지원합니다.
customer.stream ().
위의 Java 8 버전은 더 짧을뿐만 아니라 고문이 거의 없습니다 (Cycle 또는 Iterator 등) 해석주기에서 코드 해석에서 시간을 낭비하여 데이터에 대한 작업을 이해합니다.
이 코드를 동시에 실행하려면 어떻게해야합니까?
customer.parallelstream ().
더 흥미로운 점은이 기능 스타일 코드가 데이터베이스에도 적용된다는 것입니다.
데이터베이스에서 기능 메소드를 사용하십시오
전통적으로 프로그래머는 특수 데이터베이스를 사용하여 쿼리 문을 사용하여 데이터베이스의 데이터에 액세스해야합니다. 예를 들어 다음은 벨기에에서 고객을 찾는 JDBC 코드입니다.
preparedstatement s = con.preparestatement ( "select *" + "에서 c.country =?");
이 코드의 대부분은 컴파일러가 오류를 찾지 못하게 하며이 성급한 코드는 액세스 코드 액세스 코드를 매우 중복시키기위한 많은 양의 모델 코드가 있습니다 데이터베이스 쿼리 언어를 제공하면 잘못된 수표 및 보안 문제를 해결할 수 있습니다. 또는 객체 관계 매핑 도구를 사용하여 많은 수의 지루한 코드를 피하십시오. 그러나 일반적인 쿼리가 필요한 경우에만 사용할 수 있습니다.
Java 8을 사용하여 기능적 API로 데이터베이스를 쿼리하십시오. 예를 들어, JINQ는 오픈 소스 프로젝트이며, 미래의 데이터베이스 API가 기능적 프로그래밍을 가능하게 할 수 있습니다. 다음은 JINQ를 사용하는 데이터베이스 쿼리입니다.
고객.
이 코드는 스트리밍 API를 사용하는 코드와 거의 동일합니다. 실제로 JINQ 버전을 사용하면 스트리밍 API와 함께 데이터베이스 쿼리를 직접 작성할 수 있습니다. 코드가 실행되면 JINQ는 이전 JDBC 쿼리와 마찬가지로 데이터베이스 쿼리 코드로 자동 변환됩니다.
이 경우 새로운 데이터베이스 쿼리 언어를 배우지 않더라도 효율적인 데이터베이스 쿼리를 작성할 수 있습니다. 동일한 스타일의 코드를 사용하여 Java에서 수집 할 수 있습니다. 특수 Java 컴파일러 또는 가상 머신이 필요하지 않습니다. 모든 코드 컴파일 및 일반 Java 8 JDK에서 실행됩니다. 코드가 잘못되면 컴파일러는 일반적인 Java 코드처럼 컴파일러를 찾아보고합니다.
JINQ는 SQL92와 동일한 복잡한 쿼리를 지원합니다. 변환 Java 코드의 데이터베이스 쿼리 알고리즘은 수용 할 수있는 한 번역 할 수있는 한 매우 유연합니다. 예를 들어, Jinq는 복잡하지만 아래 데이터베이스 쿼리를 변환 할 수 있습니다.
고객 ctctctctctctct 그의 역할 작업 작업 작업 작업 작업 작업 작업 작업 작업 WOR Work Work Worker는 C.GetSalar () <2 * C.GetDebt ();};
보시다시피, Java 8의 기능적 프로그래밍은 데이터베이스 쿼리에 매우 적합합니다. 그리고 쿼리는 작고 복잡한 문의조차 유능할 수 있습니다.
내부 작동
하지만 어떻게 일합니까? 일반적인 Java 컴파일러는 어떻게 Java 코드를 데이터베이스 쿼리로 변환 할 수 있습니까? 이것을 가능하게하기 위해 Java 8의 특별한 점은 무엇입니까?
이러한 기능을 지원하는 이러한 새로운 데이터베이스 PI를 지원하는 핵심은 "상징적 실행"이라는 바이트 코드 분석 방법입니다. 코드는 일반 Java 컴파일러에 의해 컴파일되고 일반적인 Java 가상 머신에서 실행되지만 Jinq는 Java 코드를 컴파일 할 때 데이터베이스 쿼리를 분석하고 빌드 할 수 있습니다. Java 8 Streams API를 사용할 때 종종 짧은 기능을 분석 할 때 상징적 실행의 작업 효과가 가장 좋습니다.
이 상징적 실행이 어떻게 작동하는지 이해하려면 가장 쉬운 방법은 예를 사용하는 것입니다. Jinq에 의해 다음 쿼리가 SQL 쿼리 언어로 변환되는 방법을 확인해 봅시다.
고객. 어디서 (C-> C.getCountry (). Equals ( "Belgium")))))))
처음에는 변수 고객이 컬렉션이며 해당 데이터베이스 쿼리는 다음과 같습니다.
선택 *에서 고객 중에서 c
그런 다음 여기 () 메소드가 호출되고 함수가 전달됩니다. WHERE () 메소드에서 JINQ는이 기능의 .class 파일을 열어서 분석을 위해이 함수에 의해 편집 된 바이트 코드를 얻습니다. 이 예에서는 실제 바이트 코드를 사용하지 마십시오. 간단한 지침을 사용 하여이 기능의 바이트 코드를 나타냅니다.
d = c.getCountry () e = "벨기에"e = d.equals (e) return e
여기서는 Java 컴파일러에 의해 기능 이이 네 가지 지침으로 컴파일되었다고 가정합니다. where () 메소드가 호출되면 Jinq는 이것을 봅니다. Jinq은 어떻게이 코드를 이해할 수 있습니까?
JINQ는 코드를 실행하여 분석됩니다. 그러나 Jinq는 코드를 직접 실행하지 않습니다. Jinq는 실제 변수와 실제 값이 없으면 기호를 사용하여 코드를 실행할 때 모든 값을 표시합니다. 이것이이 분석을 "상징적 실행"이라고하는 이유입니다.
JINQ는 각 명령어를 실행하고 프로그램 상태에서 모든 부작용 또는 코드가 변경되는 모든 것을 추적합니다. 다음은 Jinq가 상징적 실행에서 4 줄의 코드를 수행 할 때 발견 된 모든 부작용을 보여주는 차트입니다.
상징적 실행의 예
그림에서 첫 번째 명령이 실행 된 후 Jinq은 두 가지 부작용을 발견했음을 알 수 있습니다. 변수 D가 변경되었고 Method Customer.GetCountry ()가 호출되었습니다. 상징적 실행이기 때문에 변수 D는 C.getCountry ()의 상징적 가치에 할당 된 "USA"또는 "Denmark"와 같은 실제 가치를 제공하지 않습니다.
이러한 모든 지침이 실행 된 후 Jinq는 부작용을 간소화했습니다. 변수 d와 e는 로컬 변수이므로 함수 종료 후에 변수가 폐기되므로 이러한 부작용은 무시할 수 있습니다. Jinq는 또한 customer.getCountry () 및 String.equals ()가 변수를 수정하거나 출력을 표시하지 않으므로 이러한 메소드를 무시할 수 있음을 알고 있습니다. 결과적으로 Jinq 은이 기능이 하나의 역할 만 생성한다고 결론을 내릴 수 있으며 C.getCountry ()를 반환합니다 ( "벨기에").
Jinq가 Where () 메소드에서 전달 된 기능을 이해하면 데이터베이스 쿼리에 대한 지식을 혼합하고 고객 컬렉션에 새 데이터베이스 쿼리를 제공 할 수 있습니다.
데이터베이스 쿼리를 생성합니다
이것이 Jinq가 코드에서 데이터베이스 쿼리를 생성하는 방법입니다. 기호 실행을 사용한다는 것은이 방법이 다른 Java 컴파일러에서 다른 코드 모드에 대해 매우 강력하다는 것을 의미합니다. JINQ가 직면 한 코드에 데이터베이스 쿼리로 변환 할 수없는 부작용이있는 경우 JINQ는 코드를 변경하지 않도록합니다. 모든 것이 정상적인 Java 코드로 작성되었으므로 Jinq는 해당 코드를 직접 실행할 수 있으며 코드는 예상 결과를 생성합니다.
이 간단한 번역 예를 통해 번역 작업을 쿼리하는 방법을 이해할 수 있어야합니다. 이러한 알고리즘이 코드에서 데이터베이스 쿼리를 올바르게 생성 할 수 있는지 확인할 수 있습니다.
아름다운 전망
Java에서 Java 8이 가져온 새로운 방법의 데이터베이스 작업을 맛볼 수 있기를 바랍니다. Java 8에서 지원하는 기능 프로그래밍을 사용하면 데이터베이스에 대한 코드를 작성하여 Java Collection의 코드를 작성할 수 있습니다. 기존 데이터베이스 API가 이러한 유형의 쿼리를 지원하도록 확장되기를 바랍니다.