3年前 (2021-10-27)  Java系列 |   抢沙发  361 
文章评分 0 次,平均分 0.0

下面的示例引入了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

关于

发表评论

表情 格式

暂无评论

登录

忘记密码 ?

切换登录

注册