[Java 8] 2. Consumer

seony·2023년 4월 23일

java8

목록 보기
2/16

⭐️ Consumer 인터페이스

package java.util.function;

import java.util.Objects;

@FunctionalInterface
public interface Consumer<T> {

    void accept(T t);
    
    default Consumer<T> andThen(Consumer<? super T> after) {
        Objects.requireNonNull(after);
        return (T t) -> { accept(t); after.accept(t); };
    }
}
  • accept 메서드는 하나의 인수를 받아 소비한다. (return 타입이 void)
  • andThen을 통해 chaining을 할 수 있다.

🌱 Consumer 예시

package com.learnJava.functionalInterfaces;

import com.learnJava.data.Student;
import com.learnJava.data.StudentDataBase;

import java.util.List;
import java.util.function.Consumer;

public class ConsumerExample {

    static Consumer<Student> c2 = (student) -> System.out.println(student);
    static Consumer<Student> c3 = (student) -> System.out.print(student.getName());
    static Consumer<Student> c4 = (student) -> System.out.println(student.getActivities());

    public static void printName() {
        List<Student> studentList = StudentDataBase.getAllStudents();
        studentList.forEach(c2);
    }

    public static void printNameAndActivities() {
        System.out.println("printNameAndActivities: ");
        List<Student> studentList = StudentDataBase.getAllStudents();
        // 이름과 액티비티 활동 뭐하는지
        studentList.forEach(c3.andThen(c4)); // consumer chaining
    }

    public static void printNameAndActivitiesUsingCondition() {
        System.out.println("printNameAndActivitiesUsingCondition: ");
        List<Student> studentList = StudentDataBase.getAllStudents();
        studentList.forEach((student) -> {
        	// 학년이 3학년 이상이고 gpa가 3.9 이상인 학생만
            if (student.getGradeLevel()>=3 && student.getGpa() >= 3.9) {
                c3.andThen(c4).accept(student);
            }
        });
    }



    public static void main(String[] args) {
        Consumer<String> c1 = s -> System.out.println(s.toUpperCase());

        c1.accept("java8");
        printName();
        printNameAndActivities();
        printNameAndActivitiesUsingCondition();
    }
}
  • forEach : Consumer를 인자로 받음
  • andThen : andThen을 사용하여 여러 Consumer를 연결해서 사용할 수 있음 consumer chaining

⭐️ BiConsumer 인터페이스


package java.util.function;

import java.util.Objects;

@FunctionalInterface
public interface BiConsumer<T, U> {

    void accept(T t, U u);

    default BiConsumer<T, U> andThen(BiConsumer<? super T, ? super U> after) {
        Objects.requireNonNull(after);

        return (l, r) -> {
            accept(l, r);
            after.accept(l, r);
        };
    }
}

🌱 BiConsumer 예시

package com.learnJava.functionalInterfaces;

import com.learnJava.data.Student;
import com.learnJava.data.StudentDataBase;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.BiConsumer;

public class BiConsumerExample {

    public static void nameAndActivities() {

        BiConsumer<String, List<String>> biConsumer = (name, activities) -> System.out.println(name + ": " + activities);

        List<Student> studentList = StudentDataBase.getAllStudents();
        studentList.forEach((student -> biConsumer.accept(student.getName(), student.getActivities())));
    }

    public static void main(String[] args) {

        BiConsumer<String, String> biConsumer = (a, b) -> {
            System.out.println("a : " + a + ", b : " + b);
        };

        biConsumer.accept("java7", "java8");

        BiConsumer<Integer, Integer> multiply = (a, b) -> {
            System.out.println("Multiplication is : " + (a * b));
        };

        BiConsumer<Integer, Integer> division = (a, b) -> {
            System.out.println("Division is : " + (a/b));
        };

        multiply.andThen(division).accept(10, 5);

        nameAndActivities();
    }
}

0개의 댓글