小编Sne*_*neh的帖子

更改ConcurrentHashMap上的现有foreach循环以使用Lambdas来利用并行处理

我正在制作一个游戏,并且有一个ConcurrentHashMap,其中包含当前登录的所有玩家.我有一个AutoSaver线程循环通过HashMap并将所有玩家1保存为1.当没有多少玩家时这很好,因为它迭代时间不会太长,但是当有很多玩家登录时它会慢一点.我使用java流和并行读取,我们可以加快集合的处理,所以我尝试将现有循环改为现在使用并行.

我的问题是,我的实施是否正确?有没有更好的方法呢?它现在是线程安全吗?

这是现有的实现

for(Player player : ActiveConnections.getAllConnectedPlayers().values(){
    if(player != null)
        saveManager.savePlayer(player, true);
}
Run Code Online (Sandbox Code Playgroud)

这是我使用流和并行的实现

ActiveConnections.getAllConnectedPlayers().values()
    .stream()
    .parallel()
    .filter((x) -> x != null)
    .forEach((x) -> saveManager.savePlayer(x, true));
Run Code Online (Sandbox Code Playgroud)

编辑 这是我的保存管理器实现

public class SaveManager {

    private MySqlManager sqlManager;

    public SaveManager(){
        sqlManager = MySqlManager.getInstance();
    }

    public void savePlayer(Player player, boolean autoSave){
       //Saves the player
    }
Run Code Online (Sandbox Code Playgroud)

我刚刚开始使用lambdas,所以如果出现问题请告诉我.

java parallel-processing lambda

5
推荐指数
1
解决办法
460
查看次数

libgdx:ModelInstance.transform.setToTranslation(..)和ModelInstance.transform.translate(..)之间有什么区别?

有什么区别:

myModel.transform.SetToTranslation( *some Vector3* )
Run Code Online (Sandbox Code Playgroud)

myModel.transform.translate( *some Vector3* )
Run Code Online (Sandbox Code Playgroud)

(其中myModel的类型为ModelInstance)

具体来说,这些操作的副作用是什么?

对我来说最重要的是,您使用一种方法而不是另一种方法的典型用例是什么?

vector-graphics libgdx

4
推荐指数
1
解决办法
552
查看次数

在没有最终参数声明的情况下将最终参数传递给另一个方法

我正在阅读有关最终变量的信息,并了解到当您将参数作为最终参数时,您无法更改它。但后来我尝试了一些东西

编译器在这里抱怨说你不能改变我能理解的最终参数

public class FinalVariableTest {

    public void method1(final FinalVariableTest object){
        object = new FinalVariableTest(); //Not allowed, compiler complains
    }

    public void method2(FinalVariableTest object){
        object = new FinalVariableTest();
    }

    public static void main(String[] args) {
        FinalVariableTest test = new FinalVariableTest();
        test.method1(test);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是编译器对此很好

public class FinalVariableTest {

    public void method1(final FinalVariableTest object){
        method2(object);
    }

    public void method2(FinalVariableTest object){
        object = new FinalVariableTest(); //Compiler does not complain
    }

    public static void main(String[] args) {
        FinalVariableTest test = new FinalVariableTest();
        test.method1(test); …
Run Code Online (Sandbox Code Playgroud)

java final

3
推荐指数
1
解决办法
164
查看次数