简体   繁体   中英

update object in hashmap by java 8 lambda

I created an item named player as follows:

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); 

}

}

create an interface named update in the player class,create a generic method named updateSalaries in the interface that takes a HashMap as input and returns a Queue of player objects after updating the salaries of players by adding 500 to each one's salary. in the mainprogram class implement the method updatesalaries as a lamdba expression.in the mainprogram class,print the elements in the returned queue.

I tried it as follows but it did not work out:

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

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

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



}

This is the full code in the main 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);



}



}

Is there any help in solving this?

In your code snippet you have the following line of code:

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

Let's take this apart piece by piece:

  1. map.replaceAll This method lets you replace all the values in a map. I believe you want to manipulate the values that are already there, instead.
  2. (k,player.getSalary()) This is where you name the variables that the lambda will dump values into. You aren't supposed to supply numbers here, you are supposed to be receiving numbers. You likely want (k, p) , where k will be set to the key (an Integer ) and p will be set to the value (a player ).
  3. player.getSalary()+500 This returns an int . The replaceAll method requires that you return the value type, which in this case is player .
  4. You forgot to include a close parenthesis at the end.

I believe you want to use this line of code instead, which mitigates all of the above errors:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM