In this article, we will discuss pre-defined Functional Interface in Java 1.8 version for performing operation (processing) based on 2 input arguments passed but it won’t return any value after processing i.e.; BiConsumer Functional Interface
1. BiConsumer Functional Interface:
- This Functional Interface has one abstract method called void accept(T t, U u); which
- Step 1 :- accepts 2 input arguments of any data-type
- Step 2 :- performs some operation or processes based on the 2 input arguments passed
- Step 3 :- And doesn’t return result after processing (operation)
- Below is the BiConsumer Functional Interface containing accept(); method along with other default & static methods
package java.util.function;
import java.util.Objects;
@FunctionalInterface
public interface BiConsumer<T, U> {
/**
* Performs this operation on the given arguments.
*
* @param t the first input argument
* @param u the second input argument
*/
void accept(T t, U u);
// other default and static methods
}
2. Examples for BiConsumer Functional Interface :
Example 1 – program to print Student info along with increased grace marks of 5 for wrong question in the exam
package net.bench.resources.biconsumer.example;
import java.util.function.BiConsumer;
class Student {
// member variables
String name;
int marks;
// public constructor
public Student(String name, int marks) {
super();
this.name = name;
this.marks = marks;
}
}
public class StudentResult {
public static void main(String[] args) {
// lambda expression to add grace marks to student using BiConsumer FI
BiConsumer<Student, Integer> c = (s, i) -> s.marks = s.marks + 5;
// create Student object with name and initial marks
Student[] sArray = {
new Student("Vijay", 92),
new Student("Ajith", 78),
new Student("Vikram", 66),
new Student("Surya", 54),
new Student("Karthi", 43),
new Student("Arya", 31)
};
// invoke BiConsumer FI, iterating through all Students
for(Student s : sArray) {
c.accept(s, 5);
}
// printing to console
for(Student s : sArray) {
System.out.println("Name : " + s.name + "\tMarks : " + s.marks);
}
}
}
Output:
Name : Vijay Marks : 97
Name : Ajith Marks : 83
Name : Vikram Marks : 71
Name : Surya Marks : 59
Name : Karthi Marks : 48
Name : Arya Marks : 36
Example 2 – program to add 2 Integers using BiConsumer and also printing to console at the same time
package net.bench.resources.biconsumer.example;
import java.util.function.BiConsumer;
public class AddTwoNumbersUsingBiConsumer {
public static void main(String[] args) {
// lambda expression to add 2 numbers using BiConsumer FI
BiConsumer<Integer, Integer> bc =
(i, j) -> System.out.println(i + " + " + j + " = " + (i+j));
// add 2 numbers invoking above lambda expression
bc.accept(7, 3);
bc.accept(19, 2);
bc.accept(20, 10);
bc.accept(15, 25);
bc.accept(1, 9);
}
}
Output:
7 + 3 = 10
19 + 2 = 21
20 + 10 = 30
15 + 25 = 40
1 + 9 = 10
3. Difference between Consumer and BiConsumer Functional Interface :
- Consumer :- It accepts 1 input argument and does some operation on the input argument passed but doesn’t return any value
- BiConsumer :- Whereas it accepts 2 input arguments and does some operation on the 2 input arguments passed and doesn’t return any value
- So, it is simple if we want to perform some operation based on single input argument and do not want to return any value then go for Consumer Functional Interface
- But in case if we require to do some operation (or processing) on 2 input arguments and do not want to return any value then BiConsumer Functional Interface is the best option
package net.bench.resources.biconsumer.example;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
public class DifferenceInConsumerAndBiConsumer {
public static void main(String[] args) {
// 1. Consumer - lambda expression to print to console Square value of input
Consumer<Integer> c = (i) -> System.out.println(
"Square of " + i + " is : " + i*i
);
// 2. BiConsumer - lambda expression to add both input arguments and print to console
BiConsumer<Integer, Integer> bc = (i,j) -> System.out.println(
"Sum of (" + i + ", "+ j + ") is : " + (i+j)
);
// 1.A test for Consumer
System.out.println("Consumer testing for printing Square value : \n");
c.accept(8);
c.accept(19);
// 2.A test for BiConsumer
System.out.println("\nBiConsumer testing for both numbers : \n");
bc.accept(7, 3);
bc.accept(19, 43);
}
}
Output:
Consumer testing for printing Square value :
Square of 8 is : 64
Square of 19 is : 361
BiConsumer testing for both numbers :
Sum of (7, 3) is : 10
Sum of (19, 43) is : 62
References:
- https://docs.oracle.com/javase/8/docs/api/java/util/function/BiConsumer.html
- https://docs.oracle.com/javase/8/docs/api/java/util/function/Consumer.html
- https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html
- https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html
Happy Coding !!
Happy Learning !!