一 概述
name | type | description |
---|---|---|
Consumer | Consumer< T > | 接收T对象,不返回值 |
Predicate | Predicate< T > | 接收T对象并返回boolean |
Function | Function< T, R > | 接收T对象,返回R对象 |
Supplier | Supplier< T > | 提供T对象(例如工厂),不接收值 |
UnaryOperator | UnaryOperator< T > | 接收T对象,返回T对象 |
BiConsumer | BiConsumer<T, U> | 接收T对象和U对象,不返回值 |
BiPredicate | BiPredicate<T, U> | 接收T对象和U对象,返回boolean |
BiFunction | BiFunction<T, U, R> | 接收T对象和U对象,返回R对象 |
BinaryOperator | BinaryOperator< T > | 接收两个T对象,返回T对象 |
参考:https://blog.csdn.net/huo065000/article/details/78964382
二 Consumer
1 作用
- 消费某个对象
2 使用场景
- Iterable接口的forEach方法需要传入Consumer,大部分集合类都实现了该接口,用于返回Iterator对象进行迭代。
3 设计思想
- 开发者调用ArrayList.forEach时,一般希望自定义遍历的消费逻辑,比如:输出日志或者运算处理等。
- 处理逻辑留给使用者,使用灵活多变。
- 多变的逻辑能够封装成一个类(实现Consumer接口),将逻辑提取出来。
PASS:Javascript能够将函数传递给另一个函数,这应该算是函数式编程的一个体现,java的function包中的类也是类似的。
public interface Iterable<T> {
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
}
4 DEMO
public class ConsumerTest {
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span><span class="hljs-params">(String[] args)</span> </span>{
ArrayList<Employee> employees = <span class="hljs-keyword">new</span> ArrayList<>();
String[] prefix = {<span class="hljs-string">"A"</span>, <span class="hljs-string">"B"</span>};
<span class="hljs-keyword">for</span> (<span class="hljs-keyword">int</span> i = <span class="hljs-number">1</span>; i <= <span class="hljs-number">10</span>; i++)
employees.add(<span class="hljs-keyword">new</span> Employee(prefix[i % <span class="hljs-number">2</span>] + i, i * <span class="hljs-number">1000</span>));
employees.forEach(<span class="hljs-keyword">new</span> SalaryConsumer());
employees.forEach(<span class="hljs-keyword">new</span> NameConsumer());
}
<span class="hljs-keyword">static</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Employee</span> </span>{
<span class="hljs-keyword">private</span> String name;
<span class="hljs-keyword">private</span> <span class="hljs-keyword">int</span> salary;
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-title">Employee</span><span class="hljs-params">()</span> </span>{
<span class="hljs-keyword">this</span>.salary = <span class="hljs-number">4000</span>;
}
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-title">Employee</span><span class="hljs-params">(String name, <span class="hljs-keyword">int</span> salary)</span> </span>{
<span class="hljs-keyword">this</span>.name = name;
<span class="hljs-keyword">this</span>.salary = salary;
}
<span class="hljs-function"><span class="hljs-keyword">public</span> String <span class="hljs-title">getName</span><span class="hljs-params">()</span> </span>{
<span class="hljs-keyword">return</span> name;
}
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setName</span><span class="hljs-params">(String name)</span> </span>{
<span class="hljs-keyword">this</span>.name = name;
}
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">int</span> <span class="hljs-title">getSalary</span><span class="hljs-params">()</span> </span>{
<span class="hljs-keyword">return</span> salary;
}
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setSalary</span><span class="hljs-params">(<span class="hljs-keyword">int</span> salary)</span> </span>{
<span class="hljs-keyword">this</span>.salary = salary;
}
<span class="hljs-meta">@Override</span>
<span class="hljs-function"><span class="hljs-keyword">public</span> String <span class="hljs-title">toString</span><span class="hljs-params">()</span> </span>{
<span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> StringBuilder()
.append(<span class="hljs-string">"name:"</span>).append(name)
.append(<span class="hljs-string">",salary:"</span>).append(salary)
.toString();
}
}
<span class="hljs-comment">// 输出需要交税的员工</span>
<span class="hljs-keyword">static</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">SalaryConsumer</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">Consumer</span><<span class="hljs-title">Employee</span>> </span>{
<span class="hljs-meta">@Override</span>
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">accept</span><span class="hljs-params">(Employee employee)</span> </span>{
<span class="hljs-keyword">if</span> (employee.getSalary() > <span class="hljs-number">2000</span>) {
System.out.println(employee.getName() + <span class="hljs-string">"要交税了."</span>);
}
}
}
<span class="hljs-comment">// 输出需要名字前缀是‘A’的员工信息</span>
<span class="hljs-keyword">static</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">NameConsumer</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">Consumer</span><<span class="hljs-title">Employee</span>> </span>{
<span class="hljs-meta">@Override</span>
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">accept</span><span class="hljs-params">(Employee employee)</span> </span>{
<span class="hljs-keyword">if</span> (employee.getName().startsWith(<span class="hljs-string">"A"</span>)) {
System.out.println(employee.getName() + <span class="hljs-string">" salary is "</span> + employee.getSalary());
}
}
}