相关疑难解决方法(0)

调用匿名类的方法

前几天我才知道你可以做到这一点

new Object() {
    void hello() {
        System.out.println("Hello World!");
    }
}.hello();
Run Code Online (Sandbox Code Playgroud)

这对我来说似乎很奇怪.当然,创建的对象的静态类型是Object,所以没有方法hello()?它几乎完全没有意义(hello例如,不可能调用两次).

我有2个问题.

  1. 有人能指出我解决这个问题的规范部分吗?
  2. 我是否正确地认为你可以调用的唯一方法hello就是这样.反思怎么样?

谢谢

java class

36
推荐指数
4
解决办法
3365
查看次数

在创建对象时声明方法

为什么第一种方式是正确的,但第二种方式不是?


第一种方式:

new Object() {
    public void a() {
        /*code*/
    }
}.a();
Run Code Online (Sandbox Code Playgroud)

第二种方式:

Object object = new Object() {
    public void a() {
        /*code*/
    }
};

object.a();
Run Code Online (Sandbox Code Playgroud)

我在哪里可以找到更多相关信息?

java methods anonymous-inner-class object anonymous-class

29
推荐指数
2
解决办法
1103
查看次数

使用局部类型推断的交叉点类型的有用应用

正如本博客所述,我们现在可以使用本地类型推断编写以下内容(据我所知,这是以前在不引入更多代码的情况下无法实现的):

public static void main(String... args) {
    var duck = (Quacks & Waddles) Mixin::create;
    duck.quack();
    duck.waddle();
}

interface Quacks extends Mixin {
    default void quack() {
        System.out.println("Quack");
    }
}

interface Waddles extends Mixin {
    default void waddle() {
        System.out.println("Waddle");
    }
}

interface Mixin {
    void __noop__();
    static void create() {}
}
Run Code Online (Sandbox Code Playgroud)

这个问题可能过于宽泛或主要基于意见,但在利用这样的交集类型时是否存在任何有用的应用?

java type-inference

8
推荐指数
2
解决办法
236
查看次数

什么相当于JAVA的流API中的C#的Select子句

我想过滤Person类的列表,最后使用Streams映射到Java中的一些匿名类.我能够在C#中轻松地做同样的事情.

人类

class Person
{
    public int Id { get; set; }

    public string Name { get; set; }

    public string Address { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

用于以期望格式映射结果的代码.

 List<Person> lst = new List<Person>();

 lst.Add(new Person() { Name = "Pava", Address = "India", Id = 1 });
 lst.Add(new Person() { Name = "tiwari", Address = "USA", Id = 2 });
 var result = lst.Select(p => new { Address = p.Address, Name = p.Name }).ToList();
Run Code Online (Sandbox Code Playgroud)

现在,如果我想访问新创建的类型的任何属性,我可以使用下面提到的语法轻松访问.

Console.WriteLine( result[0].Address);
Run Code Online (Sandbox Code Playgroud)

理想情况下,我应该使用循环来迭代结果.

我知道在java中我们收集了ToList并映射了Select.但我无法只选择Person类的两个属性.我怎么做Java

c# java java-8 java-stream

7
推荐指数
2
解决办法
1699
查看次数

为什么 Object 和 var 变量的行为不同?

有人可以解释的行为o2吗?是因为编译器优化吗?它是否记录在 JLS 的某处?

public class Test {
    public static void main(String[] args) {
        Object o1 = new Object() {
            String getSomething() {
                return "AAA";
            }
        };
        // o1.getSomething(); // FAILS
        String methods1 = Arrays.toString(o1.getClass().getMethods());        
        var o2 = new Object() {
            String getSomething() {
                return "AAA";
            }
        };        
        o2.getSomething(); // OK        
        String methods2 = Arrays.toString(o2.getClass().getMethods());        
        System.out.println(methods1.equals(methods2));
    }    
}
Run Code Online (Sandbox Code Playgroud)

产生的输出是

真的

[更新]

经过一些富有成效和有用的讨论,我想我可以理解这种行为(如果我的假设有误,请发表评论)。

首先,感谢@user207421,他解释说 Java 编译器将类型o2视为与 RHS 相同的类型,其中:

  • 延伸 Object
  • getSomething方法

然后感谢@Joachim Sauer …

java var type-inference java-10

7
推荐指数
2
解决办法
155
查看次数

Java Streams在reduce之后对值进行排序

我只是试着理解Java中的流,并且我坚持排序阶段.我的目的是用一条流来获得最昂贵的蔬菜披萨.在这一点上,我得到披萨价格,但我无法对它进行排序.谁能告诉我应该怎么做呢?

我尝试这个:

pizzas.stream()
    .flatMap(pizza -> Stream.of(pizza.getIngredients())
        .filter(list -> list.stream().noneMatch(Ingredient::isMeat))
            .map(list -> list.stream().map(Ingredient::getPrice).reduce(0,(a, b) -> a + b))
            .sorted((o1, o2) -> o1.intValue() - o2.intValue())
            )
    .forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

此代码返回未分类的比萨饼值.

java java-8 java-stream

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