下面的示例引入了adjustAccounts()
方法,该方法通过存入足够的资金使透支账户的余额为零来处理透支账户。adjustAccounts()
接受两个lambda参数,它们必须符合Predicate<T>
和Consumer<T>
的抽象方法参数列表和返回类型。
编译器确定传递给adjustAccounts()
的lambda参数是正确的。test()
方法用于获取Account
参数并执行return Account.getBalance()<0;
。类似地,accept()
被实现为接受相同的参数并执行account.deposit(-account.getBalance());
。
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Predicate;
class Account
{
private int id, balance;
Account(int id, int balance)
{
this.balance = balance;
this.id = id;
}
void deposit(int amount)
{
balance += amount;
}
int getBalance()
{
return balance;
}
int getID()
{
return id;
}
void print()
{
System.out.printf("Account: [%d], Balance: [%d]%n", id, balance);
}
}
public class LambdaDemo
{
static List<Account> accounts;
public static void main(String[] args)
{
accounts = new ArrayList<>();
accounts.add(new Account(1000, 200));
accounts.add(new Account(2000, -500));
accounts.add(new Account(3000, 0));
accounts.add(new Account(4000, -80));
accounts.add(new Account(5000, 1000));
// Deposit enough money in accounts with negative balances so that they
// end up with zero balances (and are no longer overdrawn).
adjustAccounts(account -> account.getBalance() < 0,
account -> account.deposit(-account.getBalance()));
}
static void adjustAccounts(Predicate<Account> tester,
Consumer<Account> adjuster)
{
for (Account account: accounts)
{
if (tester.test(account))
{
adjuster.accept(account);
account.print();
}
}
}
}
编译并运行应用程序。您应该观察以下输出:
Account: [2000], Balance: [0]
Account: [4000], Balance: [0]
函数包括各种函数接口的基本专门化。例如,DoubleConsumer
是消费者的primitive
。每个primitive
功能接口都是出于性能原因而存在的,以避免在输入或输出是基于primitive
类型的值时不必要的对象创建和方法调用。
虽然lambdas在简化和现代化Java编程方面做了很多工作,但在某些情况下,它们的使用仍然会导致不必要的混乱。
除特别注明外,本站所有文章均为老K的Java博客原创,转载请注明出处来自https://javakk.com/2481.html
暂无评论