通过 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;
让我们一块一块地把它拆开:
map.replaceAll
此方法可让您替换地图中的所有值。我相信您想操纵已经存在的值。
(k,player.getSalary())
这是您命名 lambda 将转储值的变量的地方。你不应该在这里提供号码,你应该接收号码。您可能需要 (k, p)
,其中 k
将设置为键(Integer
),而 p
将设置为值(player
)。
player.getSalary()+500
这个 return 是一个 int
。 replaceAll
方法要求您 return 值类型,在本例中为 player
.
- 您忘记在末尾加上右括号。
我相信您想改用这行代码,它可以减少上述所有错误:
map.forEach((k, p) -> p.setSalary(p.getSalary() + 500));
我创建了一个名为 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;
让我们一块一块地把它拆开:
map.replaceAll
此方法可让您替换地图中的所有值。我相信您想操纵已经存在的值。(k,player.getSalary())
这是您命名 lambda 将转储值的变量的地方。你不应该在这里提供号码,你应该接收号码。您可能需要(k, p)
,其中k
将设置为键(Integer
),而p
将设置为值(player
)。player.getSalary()+500
这个 return 是一个int
。replaceAll
方法要求您 return 值类型,在本例中为player
.- 您忘记在末尾加上右括号。
我相信您想改用这行代码,它可以减少上述所有错误:
map.forEach((k, p) -> p.setSalary(p.getSalary() + 500));