是否有一个java lambda表达式等价于c# linq let ?

本文关键字:linq let 等价于 表达式 有一个 java lambda 是否 | 更新日期: 2023-09-27 18:04:35

是否有一个java 8 lambda表达式等效的let设置?例如,我如何使用Java 8 lambda表达式编写这个c# linq表达式?

String[] lines = new String[]{"Porky.Pig", "Darth.Vader", "Donald.Duck", "George Lucas"};
(from l in lines      
 let p = l.IndexOf('.')
 where p >= 0
 select new
 {
     FirstName = l.Substring(0, p),
     LastName = l.Substring(p + 1)
 }).Dump();

我只想计算l.b indedoof('.')一次。我想到的最接近的是:

 String[] lines = new String[]{"Porky.Pig", "Darth.Vader", "Donald.Duck", "George Lucas"};
 Arrays.stream(lines)
       .filter(x -> x.indexOf('.') > 0)
       .map(x -> {
           int p = x.indexOf('.');
           return new Person (x.substring(0, p), x.substring( p + 1));
       });

地点:

public class Person {
    public Person(String firstName, String lastName)
    {
    }
}

好的,根据Shlomi Borovitz的回答中的建议,我想出了这个,它利用了这个Pair类

String[] lines = new String[]{"Porky.Pig", "Darth.Vader", "Donald.Duck", "George Lucas"};
Arrays.stream(lines)
      .map(x -> Pair.of(x, x.indexOf('.')))
      .filter(x -> x.getRight() > 0)
      .map(x -> new Person (x.getLeft().substring(0, x.getRight()), x.getLeft().substring( x.getRight()  + 1)));

是否有一个java lambda表达式等价于c# linq let ?

没有元组当然是个问题。但是,如果我们在问题中使用Person的声明,并接受@Ulugbek Umirov使用String.split的建议,这是一个相当整洁的解决方案:

List<Person> persons = Arrays.stream(lines)
    .map(s -> s.split("''."))
    .filter(arr -> arr.length > 1)
    .map(arr -> new Person(arr[0], arr[1]))
    .collect(Collectors.toList());

不确定Dump做什么,我任意选择将Person对象收集到List中。

c#中的linq查询被转换为"点语法"(这是常规的方法调用):
查询:

from l in lines      
let p = l.IndexOf('.')
where p >= 0
select new 
{
    FirstName = l.Substring(0, p), 
    LastName = l.Substring(p + 1)
}

被转换成这样:

lines.Select(l => new {l, p = l.IndexOf('.') })
     .Where(_ => _.p >= 0)
     .Select(_ => new 
         { 
             FirstName = _.l.SubString(0, _.p), 
             LastName = _.l.SubString(_.p + 1) 
         })

找出如何在Java中做到这一点。

如果没有与c#的匿名类型等效的,元组是一个好主意,在使用时不需要创建另一个类。