当前位置: 首页 > 知识库问答 >
问题:

List foreach方法[重复]

皇甫飞宇
2023-03-14

我做了这个方法:

public void update(){
        for(GameObject object : objects)
            object.update();
}

然后我的IDE我可以使用每一个代替任何,我认为我做了,任何我让它取代它。这就是它给我的:

public void update(){
        objects.forEach(GameObject::update);
}

乍一看,这似乎更好,然后我的IDE说,您可以将它转换为lambda表达式,这将是:

public void update(IUpdater updater){
        objects.forEach((object) -> object.update());
}

这给人的印象是GameObject::Update是lambda表达式的一段时间,而我所知道的Java8中唯一的新东西(object)->object.update()取代了匿名类,估计它还隐藏在什么地方。

“Objects.Foreach(GameObject::Update)”这一本质是否意味着:

public void update(){
    objects.forEach(new Consumer<GameObject>() {
        @Override
        public void accept(GameObject object) {
            object.update();
        }
    });
}

如果是这种情况,那么我的原始方法是否比gameobject::update更有效。保留了GameObject::Update的方法,但如果发现原始方法更有效,就会把它改回来。

我提出这个问题纯粹是基于表现。

共有1个答案

闻人杰
2023-03-14

我会使用任何一个你觉得最简单和最清楚的,这可能表现足够好。一旦您对应用程序进行了分析,并显示这是您最大的问题之一,那么您就应该考虑优化它。

但是为了学术目的...

方法引用和lambda表达式之间的一个关键区别是它们是不可捕获的。这意味着该对象只在HotSpot Java8上创建一次。如果您使用匿名内部类,它将在每次调用代码时创建(但不是在每次迭代时)注意:使用for-each循环会使用迭代器,这可能会创建一个新对象,但转义分析不会消除它。

 类似资料:
  • 我需要一些帮助,从理论上更好地理解方法。我读过(强调我的): 当对两个单独的对象调用时(根据方法,这两个对象是相等的),它将返回相同的哈希代码值。但是,如果在两个不相等的对象上调用它,它不一定会返回不同的整数值。 上述例外情况会发生在哪里?

  • 我尝试了以下代码,但不理解输出: 输出:字符串 为什么? 感谢您的关注!

  • 重载子类中重写的方法,我是重载父方法还是重载子类方法? 我大体上理解什么是超载和超驰。 重载-同一方法在同一个类中有不同的参数和可能的返回类型。 重写-子类中的方法签名与父类中的方法签名相同,但实现不同。 方法B.a(INTX)是重载a.a还是重载B.a?

  • subA类是A类的子类。我试图重写一个方法,但不知怎的,它不允许我重写它。为什么会这样?是因为参数中的参数吗? 读取错误消息: 名称冲突:subA中的add(E#1)和A中的add(E#2)具有相同的擦除,但两者都不重写另一个,其中E#1、E#2是类型变量: E#1扩展了subA类中声明的对象 E#2扩展了A类中声明的对象 超类A: 子类subA:

  • 我正在尝试使用Typescript重载一个方法。Java或C#中通常的重载方式似乎不适用于Typescript。我不能这样做: 我四处搜索,发现我必须这样做: 对我来说,这个方法似乎很不整洁,很难维护,因为我把所有东西都乱七八糟地放在一个方法中,并使用if/ther语句来划分逻辑。 有没有更好的方法可以在Typescript中进行方法重载?

  • 为什么上面的代码有编译错误“java:default method equals in interface Table重写java.lang.Object的一个成员”?难道我们不能使用接口默认方法重写hashCode和equals方法吗?假设我在同一个接口中有方法来确定实现这个接口的对象的相等性?