Java - BinaryOperator 예제

Java 8에서 도입된 BinaryOperator의 기본적인 사용 방법 및 예제에 대해서 알아보겠습니다.

1. BinaryOperator

BinaryOperator는 Type T의 인자 두개를 받고, 동일한 Type T 객체를 리턴하는 함수형 인터페이스입니다.

public interface BinaryOperator<T> extends BiFunction<T,T,T> {

  public static <T> BinaryOperator<T> minBy(Comparator<? super T> comparator) {
      Objects.requireNonNull(comparator);
      return (a, b) -> comparator.compare(a, b) <= 0 ? a : b;
  }

  public static <T> BinaryOperator<T> maxBy(Comparator<? super T> comparator) {
      Objects.requireNonNull(comparator);
      return (a, b) -> comparator.compare(a, b) >= 0 ? a : b;
  }
}

BinaryOperator는 BiFunction를 상속하며, apply()를 호출하여 어떤 작업을 수행할 수 있습니다. 또한, minBy(), maxBy()라는 static 메소드를 제공합니다.

public interface BiFunction<T, U, R> {
      R apply(T t, U u);
}

2. BinaryOperator의 구현 방법 및 예제

BinaryOperator는 Lambda 표현식으로 구현할 수 있습니다.

apply() 호출과 함께 두개의 인자를 전달하면, 람다식의 구현이 수행되며 인자와 동일한 타입의 객체가 리턴됩니다.

import java.util.function.BinaryOperator;

public class BinaryOperatorExample1 {

    public static void main(String[] args) {

        BinaryOperator<Integer> binaryOperator = (n1, n2) -> n1 + n2;

        Integer sum = binaryOperator.apply(10, 100);

        System.out.println(sum);
    }
}

Output:

110

3. BinaryOperator.maxBy()

BinaryOperator.maxBy()는 Comparator를 이용하여 두개의 객체를 비교하고 큰 값을 리턴하는 BinaryOperator를 생성합니다.

즉, maxBy()에 타입 T 객체의 크기를 비교하는 람다식을 인자로 전달하면 BinaryOperator 함수가 생성됩니다. 이때 생성된 BinaryOperator 함수는, 두개의 인자 중에 큰 객체를 리턴합니다.

아래 예제에서 maxBy()로 큰 값을 찾는 BinaryOperator 객체를 생성하였습니다. apply()를 호출하면 전달된 두개 인자 중에 큰 값을 리턴합니다.

import java.util.function.BinaryOperator;

public class Example {

    public static void main(String[] args) {

        BinaryOperator<Item> binaryOperator = BinaryOperator.maxBy(
                (Item i1, Item i2) -> i1.getId() - i2.getId());

        Item item1 = new Item(10, "first");
        Item item2 = new Item(20, "second");

        Item max = binaryOperator.apply(item1, item2);

        System.out.println(max);
    }

    public static class Item {
        private int id;
        private String value;
        public Item(int id, String value) {
            this.id = id;
            this.value = value;
        }

        public int getId() {
            return id;
        }

        public String getValue() {
            return value;
        }

        @Override
        public String toString() {
            return "[id = " + id + ", value = " + value + "]";
        }
    }
}

Output:

[id = 20, value = second]

4. BinaryOperator.minBy()

minBy()는 두 객체를 비교하여 작은 값을 리턴하는 BinaryOperator를 생성합니다. 구현 및 사용 방법은 maxBy()와 동일합니다.

import java.util.function.BinaryOperator;

public class Example {

    public static void main(String[] args) {

        BinaryOperator<Item> binaryOperator = BinaryOperator.minBy(
                (Item i1, Item i2) -> i1.getId() - i2.getId());

        Item item1 = new Item(10, "first");
        Item item2 = new Item(20, "second");

        Item min = binaryOperator.apply(item1, item2);

        System.out.println(min);
    }

    public static class Item {
        private int id;
        private String value;
        public Item(int id, String value) {
            this.id = id;
            this.value = value;
        }

        public int getId() {
            return id;
        }

        public String getValue() {
            return value;
        }

        @Override
        public String toString() {
            return "[id = " + id + ", value = " + value + "]";
        }
    }
}

Output:

[id = 10, value = first]
Loading script...

Related Posts

codechachaCopyright ©2019 codechacha