当前位置: 首页 > 面试题库 >

什么等效于JAVA的Streams API中的C#的Select子句

薛征
2023-03-14
问题内容

我想过滤Person类的列表,最后使用Streams映射到Java中的一些匿名类。我可以在C#中很容易地做同样的事情。

人类

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

    public string Name { get; set; }

    public string Address { get; set; }
}

代码以所需格式映射结果。

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

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

Console.WriteLine( result[0].Address);

理想情况下,我应该使用循环遍历结果。

我知道在Java中我们已经为ToList收集并为Select映射。但是我无法选择Person类的两个属性。我该怎么办Java


问题答案:

好吧,您可以将Person实例映射到匿名类的实例,例如

class Person {
    int id;
    String name, address;

    public Person(String name, String address, int id) {
        this.id = id;
        this.name = name;
        this.address = address;
    }
    public int getId() {
        return id;
    }
    public String getName() {
        return name;
    }
    public String getAddress() {
        return address;
    }
}

你可以做

List<Person> lst = Arrays.asList(
                       new Person("Pava", "India", 1), new Person("tiwari", "USA", 2));
List<?> result = lst.stream()
    .map(p -> new Object() { String address = p.getAddress(); String name = p.getName(); })
    .collect(Collectors.toList());

但是您可能会注意到,它并不那么简洁,更重要的是,result变量的声明不能引用匿名类型,这使得匿名类型的实例几乎不可用。

当前,lambda表达式是唯一支持声明隐式变量的Java功能,该隐式变量可以是匿名的。例如,以下方法将起作用:

List<String> result = lst.stream()
    .map(p -> new Object() { String address = p.getAddress(); String name = p.getName(); })
    .filter(anon -> anon.name.startsWith("ti"))
    .map(anon -> anon.address)
    .collect(Collectors.toList());


 类似资料:
  • 问题内容: 我可以在C#中做到这一点: 例如在Java中 我如何查询这样的ArrayList?谢谢。 问题答案: Java 8引入了Stream API ,该API允许与Linq中的构造类似的构造。 例如,您的查询可以表示为: 如果存在默认值,您显然需要锻炼,在这种情况下,这似乎很奇怪,但是我已经展示了它,因为这就是您问题中的代码所做的。

  • 问题内容: Java 在JavaScript中相当于什么? 问题答案: 简单的答案是没有这样的功能。 您拥有的最接近的东西是: 请注意,您 尤其 不想等待(例如在旋转循环中),因为您的浏览器几乎可以肯定会在单线程环境中执行JavaScript。

  • 问题内容: 我需要实现在单击按钮60秒后才能运行的功能。请帮助,我使用了Timer类,但是我认为这不是最好的方法。 问题答案: “我使用了Timer类,但是我认为那不是最好的方法。” 其他答案假定您未在用户界面(按钮)上使用Swing。 如果您正在使用Swing,请 不要 使用它,因为它将冻结您的Swing应用程序。 相反,您应该使用。 有关更多信息和示例,请参见Java教程如何使用Swing计时

  • 问题内容: 我想将Java中的类转换为C#,大部分更改已经完成,但是我不确定这部分。我想转换以下代码行: 我已经试过了: 但是它不能正常工作,因为GetBytes()期望翻倍。我不确定将其转换为双精度是否可以解决问题,所以我想在这里询问。 问题答案: 根据您的编码,您可以执行以下操作: 有关参考,请参见http://msdn.microsoft.com/zh- cn/library/ds4kkd5

  • 问题内容: 在C#中,您可以执行以下操作: 是否有与此等效的Java? 问题答案: Java没有通过关键字向C#提供类型推断,因此尽管您可以创建匿名类型,但由于无法获取其属性,它们的效果不是很好。 因此,您可以像这样创建一个匿名类的实例: 但是由于是您无法在代码中访问的实例,并且已经创建了 匿名 类的实例,因此根据定义,没有办法显式引用该类。 在C#中,可以通过推断类型来解决此问题,但是在Java

  • 问题内容: 我有以下用Java编写的代码。我需要与此等效的C#。 问题答案: 这里的C#代码等效于Java。