通过 java 8 lambda 更新 hashmap 中的对象

update object in hashmap by java 8 lambda

我创建了一个名为 player 的项目,如下所示:

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.logging.Level;
import java.util.logging.Logger;

public class player implements Comparable <player> {

 int PlayerId ; 
 String name ;
 double salary;

public player(int PlayerId) {
    this.PlayerId = PlayerId;
}


public void setPlayerId(int PlayerId) {
    this.PlayerId = PlayerId;
}


public void setName(String name) {
    this.name = name;
}

public void setSalary(double salary) {
    this.salary = salary;
}

public int getID() {
    return PlayerId;
}

public String getName() {
    return name;
}

public double getSalary() {
    return salary;
}


  @Override
   public int hashCode() {

    int key = 2;

    return key=2*key+PlayerId;
   }

   @Override
   public boolean equals(Object obj) {
    if (obj == null) {
        return false;
    }
    if (getClass() != obj.getClass()) {
        return false;
    }
    final player other = (player) obj;
    if (this.PlayerId != other.PlayerId) {
        return false;
    }
    return true;
   }


   @Override
    public String toString(){

   return hashCode()+" "+getID() +" "+getName()+" "+getSalary();

  }

  // generic method StoreplayerDetails
  public <T> void StoreplayerDetails( HashMap<Integer,T> inputMap ) {
  // save elements into text file

  PrintWriter pw = null;
     try {
         pw = new PrintWriter(new FileOutputStream("OutPut.txt"));
         for(T  element : inputMap.values())
             pw.println(element);
         pw.close();
     } catch (FileNotFoundException ex) {
         Logger.getLogger(MainProgram.class.getName()).log(Level.SEVERE, null, ex);
     } finally {
         pw.close();
     }
 }

@Override
public int compareTo(player other) {
    if(this.salary>other.salary)
    return 1;
else
    if(this.salary<other.salary)
        return -1;
return 0;  
}

 public interface Update  {

 public <T> void updateSalaries( HashMap<Integer,player> inputMap); 

}

}

在玩家中创建一个名为 update 的接口 class ,在接口中创建一个名为 updateSalaries 的通用方法,该方法将 HashMap 作为输入,并 returns 在更新薪水后的玩家对象队列球员每人工资加500。 在主程序中 class 将方法 updatesalaries 实现为 lamdba 表达式。在主程序中 class,打印返回队列中的元素。

我试了下,还是不行:

@Override
public <T> void updateSalaries(HashMap<Integer, player> map) {

 map.replaceAll((k,player.getSalary()) -> player.getSalary()+500;

  System.out.println("new map"+map);



}

这是主要部分的完整代码class

 import java.util.HashMap;
 import player.player.Update;

 public class MainProgram implements Update{


public static void main(String[] args) {

 HashMap< Integer,player> Keys = new HashMap<>();

 player p1 =new player(1);
 p1.setName("Ali");
 p1.setSalary(5000);

 player p2 =new player(2);
 p2.setName("Sayed");
 p2.setSalary(7000);

 player p3 =new player(3);
 p3.setName("soha");
 p3.setSalary(3000);

 Keys.put(1, p1);
 Keys.put(2, p2);
 Keys.put(3, p3);


  // p1.StoreplayerDetails(Keys);
   MainProgram m = new MainProgram();

   m.updateSalaries(Keys);


}

@Override
public <T> void updateSalaries(HashMap<Integer, player> map) {

 map.replaceAll((k,player.getSalary()) -> player.getSalary()+500;

  System.out.println("new map"+map);



}



}

有什么办法可以解决这个问题吗?

在您的代码片段中,您有以下代码行:

map.replaceAll((k,player.getSalary()) -> player.getSalary()+500;

让我们一块一块地把它拆开:

  1. map.replaceAll 此方法可让您替换地图中的所有值。我相信您想操纵已经存在的值。
  2. (k,player.getSalary()) 这是您命名 lambda 将转储值的变量的地方。你不应该在这里提供号码,你应该接收号码。您可能需要 (k, p),其中 k 将设置为键(Integer),而 p 将设置为值(player)。
  3. player.getSalary()+500 这个 return 是一个 intreplaceAll 方法要求您 return 值类型,在本例中为 player.
  4. 您忘记在末尾加上右括号。

我相信您想改用这行代码,它可以减少上述所有错误:

map.forEach((k, p) -> p.setSalary(p.getSalary() + 500));