是否有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.IndexOf('。')一次。我想出的最接近的是:
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)));
答案 0 :(得分:6)
缺少元组肯定是个问题。但是如果我们在问题中使用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
。
答案 1 :(得分:4)
C#中的linq查询转换为“dot syntaxt”(常规方法调用):
查询:
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#的匿名类型相同的元组,那么元组是一个好主意,其用法并不能证明创建另一个类。