用Java8Lambda更新hashmap中的对象

用Java8Lambda更新hashmap中的对象,java,lambda,interface,hashmap,implements,Java,Lambda,Interface,Hashmap,Implements,我创建了一个名为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 Comp

我创建了一个名为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); 

}

}
import java.io.FileNotFoundException;
导入java.io.FileOutputStream;
导入java.io.PrintWriter;
导入java.util.HashMap;
导入java.util.logging.Level;
导入java.util.logging.Logger;
公共类播放器实现了可比较的{
int PlayerId;
字符串名;
双薪;
公共玩家(int玩家ID){
this.PlayerId=PlayerId;
}
public void setPlayerId(int PlayerId){
this.PlayerId=PlayerId;
}
公共void集合名(字符串名){
this.name=名称;
}
公共收入(双倍工资){
这个。薪水=薪水;
}
公共int getID(){
返回PlayerId;
}
公共字符串getName(){
返回名称;
}
公共双薪制{
返回工资;
}
@凌驾
公共int hashCode(){
int键=2;
返回键=2*键+播放器ID;
}
@凌驾
公共布尔等于(对象obj){
if(obj==null){
返回false;
}
如果(getClass()!=obj.getClass()){
返回false;
}
最终玩家其他=(玩家)obj;
if(this.PlayerId!=其他.PlayerId){
返回false;
}
返回true;
}
@凌驾
公共字符串toString(){
返回hashCode()+“”+getID()+“”+getName()+“”+getSalary();
}
//泛型方法StoreplayerDetails
public void StoreplayerDetails(HashMap inputMap){
//将元素保存到文本文件中
PrintWriter pw=null;
试一试{
pw=新的PrintWriter(新的FileOutputStream(“OutPut.txt”);
for(T元素:inputMap.values())
pw.println(元素);
关闭();
}捕获(FileNotFoundException ex){
Logger.getLogger(MainProgram.class.getName()).log(Level.SEVERE,null,ex);
}最后{
关闭();
}
}
@凌驾
公共整数比较(其他玩家){
如果(本次薪资>其他薪资)
返回1;
其他的

如果(this.salary在代码段中有以下代码行:

map.replaceAll((k,player.getSalary()) -> player.getSalary()+500;
让我们一块一块地把它拆开:

  • map.replaceAll
    此方法允许您替换映射中的所有值。我相信您希望操作已经存在的值
  • (k,player.getSalary())
    这是命名lambda将值转储到其中的变量的地方。您不应该在这里提供数字,而是应该接收数字。您可能希望
    (k,p)
    ,其中
    k
    将设置为键(一个
    整数
    )将
    p
    设置为该值(a
    player
  • player.getSalary()+500
    返回一个
    int
    replaceAll
    方法要求返回值类型,在本例中为
    player
  • 你忘了在结尾加上一个右括号
  • 我相信您希望改用这行代码,这将减轻上述所有错误:

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

    你确定你的代码可以编译吗?这看起来很可疑
    map.replaceAll((k,player.getSalary())->player.getSalary()+500;
    你可能想要
    for(player p:map.values())p.setSalary(p.getSalary()+500)
    非常感谢你,它在@user上运行得很好
    map.replaceAll((k,player.getSalary()) -> player.getSalary()+500;
    
    map.forEach((k, p) -> p.setSalary(p.getSalary() + 500));