Java의 공급업체 및 소비자 인터페이스를 사용하는 시기와 이유는 무엇입니까?
있는 비 로서, 는 자바를 읽고 .Supplier
★★★★★★★★★★★★★★★★★」Consumer
인터페이스입니다.그리고 나는 그들의 용법과 의미를 이해할 수 없다.
이러한 인터페이스를 사용하는 시기와 이유는 무엇입니까?누가 이것에 대해 간단한 예시를 들어줄 수 있나요?
제가 이해하기엔 Doc의 예가 간결하지 않은 것 같아요.
java.util.function
여기서 정의되어 있는 인터페이스가 아무런 의미가 없다는 것입니다.그것들은 주로 의미론이 아닌 구조를 나타내기 위해 존재합니다.
Java API를 사용합니다.클래스나 인터페이스와 같은 일반적인 Java API에는 의미가 있습니다.이 API가 나타내는 것에 대한 멘탈모델을 개발하고 이를 사용하여 조작을 이해할 수 있습니다.java.util.List
들들 a 。List
을 하다을 사용하다 the the록음음음음음음음음음음음음음음음음 the the the the the the the the the the the the the the the the the the the the 。size()
. 각 오브젝트에는 0..size-1(포함) 범위의 인덱스가 있습니다.인덱스 i의 오브젝트는 호출로 취득할 수 있습니다.list.get(i)
기타 등등.
의 기능 java.util.function
그런 의미가 없어요.대신 인수 수, 반환 값 수, 인수 또는 반환 값이 원시인지 여부 등 단순히 함수의 구조를 나타내는 인터페이스입니다.이렇게 해서...Function<T,R>
이것은 타입 T의 단일 인수를 사용하여 타입 R의 값을 반환하는 함수를 나타냅니다.바로 그겁니다.그 기능은 어떤 기능을 합니까?어떤 일이든 할 수 있습니다.단일 인수가 필요하고 단일 값이 반환되는 한 말입니다.그 때문에, 의 사양은Function<T,R>
이래서''는 '''이래'''이래서'''이래서'''이래서'''이래서''이래서'''이래서''이래서''이래서''''
확실히, 우리가 코드를 쓸 때, 그것은 의미를 가지고 있고, 그 의미는 어딘가에서 온 것이어야 한다.기능 인터페이스의 경우, 그 의미는 사용되는 컨텍스트에서 유래합니다. " " "Function<T,R>
고립되어서는 의미가 없습니다. ,에서는java.util.Map<K,V>
API를 사용합니다.
V computeIfAbsent(K key, Function<K,V> mappingFunction)
(간단함을 위해 생략된 와일드카드)
이 은 ,, 도는 ah도 ah ah.Function
「입니다.게게무 슨슨?문맥에서 " "가"의 경우,key
는 맵에 아직 존재하지 않습니다.매핑 함수가 호출되어 키가 전달되고 값이 생성될 것으로 예상되며 생성된 키와 값의 쌍이 맵에 삽입됩니다.
를 볼요.Function
(또는 다른 기능 인터페이스 중 하나), 그리고 그 의미를 식별하려고 합니다.그 의미를 이해하려면 다른 API에서 사용되는 위치를 살펴봐야 하며, 그 의미는 해당 컨텍스트에만 적용됩니다.
공급업체:
public Integer getInteger() {
return new Random().nextInt();
}
컨슈머:
public void sum(Integer a, Integer b) {
System.out.println(a + b);
}
따라서 평신도 용어로 공급업체는 (수익률에서와 같이) 일부 가치를 반환하는 방법입니다.한편, 컨슈머는 (method 인수와 같이) 값을 소비하고 그 값을 조작하는 메서드입니다.
다음과 같은 형태로 변환됩니다.
// new operator itself is a supplier, of the reference to the newly created object
Supplier<List<String>> listSupplier = ArrayList::new;
Consumer<String> printConsumer = a1 -> System.out.println(a1);
BiConsumer<Integer, Integer> sumConsumer = (a1, a2) -> System.out.println(a1 + a2);
사용법에 대해서는 가장 기본적인 예를 들 수 있습니다.method 입니다.이는 반복 중인 스트림의 요소를 소비하는 Consumer를 사용하여 각 스트림에 대해 몇 가지 작업을 수행합니다.아마 인쇄했을 거예요.
Consumer<String> stringConsumer = (s) -> System.out.println(s.length());
Arrays.asList("ab", "abc", "a", "abcd").stream().forEach(stringConsumer);
A Supplier
는 인수를 사용하지 않고 값을 반환하는 메서드입니다.그 역할은 말 그대로 예상되는 클래스의 인스턴스를 제공하는 것입니다.를 들어는 'getter', 'getter'입니다.Supplier
public Integer getCount(){
return this.count;
}
" " "myClass::getCount
의 예다.Supplier<Integer>
.
A Consumer
인수를 사용하고 아무것도 반환하지 않는 메서드입니다.그것은 그 부작용 때문에 발동된다.Consumer
입니다.void
' 이 좋은예입니다. '설정자'는 '설정자'입니다.
public void setCount(int count){
this.count = count;
}
" " "myClass::setCount
의 예다.Consumer<Integer>
★★★★★★★★★★★★★★★★★」IntConsumer
.
A Function<A,B>
는 한 유형의 인수를 사용하고 다른 인수를 반환하는 메서드입니다.'어느 정도'는요.Function<A,B>
A
a를 .B
할 점은 값인 of of of . . . . 。A
값인 "예"를 B
A
★★★★★★★★★★★★★★★★★」B
는 실제로 될 수 .
public Integer addTwo(int i){
return i+2;
}
" " "myClass:addTwo
는 입니다.Function<Integer, Integer>
a. a. a.ToIntFunction<Integer>
.
getter에 대한 Class 메서드 참조도 함수의 다른 예입니다.
public Integer getCount(){
return this.count;
}
레퍼런스 " " " 」MyClass::getCount
의 예다.Function<MyClass,Integer>
★★★★★★★★★★★★★★★★★」ToIntFunction<MyClass>
.
Consumer/Supplier/기타 기능 인터페이스가 java.util.function 패키지에 정의되어 있는 이유는 무엇입니까?Consumer와 Supplier는 Java 8에서 제공되는 내장 기능 인터페이스 중 2개입니다.이러한 내장 기능 인터페이스의 목적은 공통 기능 기술자(기능 메서드의 시그니처/정의)를 가지는 기능 인터페이스에 「템플릿」을 제공하는 것입니다.
타입 T를 다른 타입 R로 변환하기 위한가 있다고 합니다.이와 같이 정의된 함수를 메서드에 전달하려면 함수/추상 메서드가 타입 T의 파라미터를 입력으로 받아들이고 타입 R의 파라미터를 출력으로 제공하는 기능 인터페이스를 정의할 필요가 있습니다.이러한 시나리오는 여러 가지가 있을 수 있으며 프로그래머는 필요에 따라 여러 기능 인터페이스를 정의하게 됩니다.이러한 시나리오를 피하기 위해 프로그래밍을 용이하게 하고 기능 인터페이스 사용에 관한 공통의 표준을 도입합니다.또한 Predicate, Function, Consumer, Supplier 등의 내장 기능 인터페이스 세트가 정의되어 있습니다.
컨슈머의 기능: 컨슈머의 기능 인터페이스는 입력을 받아들여 그 입력으로 어떤 처리를 하고 출력을 내지 않습니다.정의는 (Java Source에서) 다음과 같습니다.
@FunctionalInterface
public interface Consumer<T> {
void accept(T t);
}
여기서 accept()는 입력을 받고 출력을 반환하지 않는 함수\abstract 메서드입니다.따라서 Integer를 입력하는 경우 출력 없이 Integer를 사용하여 작업을 수행한 후 자체 인터페이스를 정의하는 대신 Consumer 인스턴스를 사용합니다.
공급업체의 기능: 공급업체의 기능 인터페이스는 입력을 받지 않고 출력을 반환합니다.(Java Source에서) 다음과 같이 정의됩니다.
@FunctionalInterface
public interface Supplier<T> {
T get();
}
필요한 함수가 있으면 Integer라고 하지만 출력을 받지 않는 경우 공급업체의 인스턴스를 사용합니다.
컨슈머와 써플라이어의 인터페이스의 사용 예와 함께, 보다 명확한 사용이 필요한 경우는, 같은 블로그 투고(http://www.javabrahman.com/java-8/java-8-java-util-function-consumer-tutorial-with-examples/ 및 http://www.javabrahman.com/java-8/java-8-java-util-function-supplier-tutorial-with-examples/)를 참조해 주세요.
1. 의미
여기와 다른 질문에 대한 답변을 참조하십시오.단, 이 새로운 인터페이스는 모든 사용자가 + 펑키한 방법 체인을 사용할 수 있도록 규약과 설명을 제공합니다..forEach(someMethod().andThen(otherMethod()))
2. 차이점
개인 사용자:뭔가를 가져가고, 뭔가를 하고, 아무것도 돌려주지 않는다.void accept(T t)
공급업체:아무것도 가져가지 않고 무언가를 반환합니다.T get()
컨슈머의 인 'getter'
3. 사용방법
// Consumer: It takes something (a String) and does something (prints it)
List<Person> personList = getPersons();
personList.stream()
.map(Person::getName)
.forEach(System.out::println);
공급업체: 반복 코드 랩(예: 코드 실행 타이밍)
public class SupplierExample {
public static void main(String[] args) {
// Imagine a class Calculate with some methods
Double result1 = timeMe(Calculate::doHeavyComputation);
Double result2 = timeMe(Calculate::doMoreComputation);
}
private static Double timeMe(Supplier<Double> code) {
Instant start = Instant.now();
// Supplier method .get() just invokes whatever it is passed
Double result = code.get();
Instant end = Instant.now();
Duration elapsed = Duration.between(start,end);
System.out.println("Computation took:" + elapsed.toMillis());
return result;
}
}
컨슈머와 공급업체는 Java에서 제공하는 인터페이스입니다.컨슈머는 리스트 요소에서 반복에 사용되고 공급업체는 공급 객체의 반복에 사용됩니다.
코드 데모를 통해 쉽게 이해할 수 있습니다.
컨슈머
package com.java.java8;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
/**
* The Class ConsumerDemo.
*
* @author Ankit Sood Apr 20, 2017
*/
public class ConsumerDemo {
/**
* The main method.
*
* @param args
* the arguments
*/
public static void main(String[] args) {
List<String> str = new ArrayList<>();
str.add("DEMO");
str.add("DEMO2");
str.add("DEMO3");
/* Consumer is use for iterate over the List */
Consumer<String> consumer = new Consumer<String>() {
@Override
public void accept(String t) {
/* Print list element on consile */
System.out.println(t);
}
};
str.forEach(consumer);
}
}
공급자.
package com.java.java8;
import java.util.function.Supplier;
/**
* The Class SupplierDemo.
*
* @author Ankit Sood Apr 20, 2017
*/
public class SupplierDemo {
/**
* The main method.
*
* @param args
* the arguments
*/
public static void main(String[] args) {
getValue(() -> "Output1");
getValue(() -> "OutPut2");
}
/**
* Gets the value.
*
* @param supplier
* the supplier
* @return the value
*/
public static void getValue(Supplier<?> supplier) {
System.out.println(supplier.get());
}
}
평신도로 말하면
공급업체는 데이터를 공급하지만 데이터를 소비하지는 않습니다.프로그래밍 용어에서는 인수를 사용하지 않고 값을 반환하는 메서드입니다.새 값을 생성하기 위해 사용됩니다.
http://codedestine.com/java-8-supplier-interface/
소비자는 데이터를 소비하지만 데이터는 반환하지 않습니다.프로그래밍 용어에서 다중 인수를 사용하고 값을 반환하지 않는 메서드입니다.
http://codedestine.com/java-8-consumer-interface/
언급URL : https://stackoverflow.com/questions/28417262/when-and-why-would-you-use-javas-supplier-and-consumer-interfaces
'programing' 카테고리의 다른 글
컴포넌트에 Import된 css 파일의 순서(vuejs) (0) | 2023.01.13 |
---|---|
CloudFlare 및 PHP를 통한 방문자 IP 주소 로깅 (0) | 2023.01.13 |
open with 문을 사용하여 파일을 여는 방법 (0) | 2023.01.13 |
마이그레이션 데이터를 MariaDB 데이터베이스로 가져올 수 없습니다. (0) | 2023.01.13 |
PHP로 URL이 존재하는지 확인하려면 어떻게 해야 하나요? (0) | 2023.01.13 |