由于Java 8带有强大的lambda表达式,
我想写一个函数将一个List /数组的字符串转换为数组/整数列表,浮点数,双精度等.
在普通的Java中,它会如此简单
for(String str : strList){
intList.add(Integer.valueOf(str));
}
Run Code Online (Sandbox Code Playgroud)
但是如果将一个字符串数组转换为整数数组,我如何用lambda实现相同的效果.
lambda表达式中使用的变量应该是final或者有效的final
当我尝试使用calTz它时显示此错误.
private TimeZone extractCalendarTimeZoneComponent(Calendar cal, TimeZone calTz) {
try {
cal.getComponents().getComponents("VTIMEZONE").forEach(component -> {
VTimeZone v = (VTimeZone) component;
v.getTimeZoneId();
if (calTz == null) {
calTz = TimeZone.getTimeZone(v.getTimeZoneId().getValue());
}
});
} catch (Exception e) {
log.warn("Unable to determine ical timezone", e);
}
return null;
}
Run Code Online (Sandbox Code Playgroud) 我想声明一个"空"的lambda表达式,它确实没有.有没有办法在不需要方法的情况下做这样的事情DoNothing()?
public MyViewModel()
{
SomeMenuCommand = new RelayCommand(
x => DoNothing(),
x => CanSomeMenuCommandExecute());
}
private void DoNothing()
{
}
private bool CanSomeMenuCommandExecute()
{
// this depends on my mood
}
Run Code Online (Sandbox Code Playgroud)
我这样做的意图只是控制我的WPF命令的启用/禁用状态,但这是暂且不说的.也许这对我来说太早了,但我想必须有办法以x => DoNothing()某种方式声明lambda表达式来完成同样的事情:
SomeMenuCommand = new RelayCommand(
x => (),
x => CanSomeMenuCommandExecute());
Run Code Online (Sandbox Code Playgroud)
有办法做到这一点吗?似乎没有必要采用无操作方法.
具体来说,我有TabPane,我想知道是否有特定ID的元素.
所以,我想用Java中的lambda表达式做到这一点:
boolean idExists = false;
String idToCheck = "someId";
for (Tab t : tabPane.getTabs()){
if(t.getId().equals(idToCheck)) {
idExists = true;
}
}
Run Code Online (Sandbox Code Playgroud) lambda表达式_=> expr意味着什么?
_作为lambda输入的目的是什么?
例:
int count = 0;
list.ForEach(_ => count += 1);
Run Code Online (Sandbox Code Playgroud) 在我们的项目中,我们正在迁移到Java 8,我们正在测试它的新功能.
在我的项目中,我使用Guava谓词和函数来使用Collections2.transform和过滤和转换一些集合Collections2.filter.
在这次迁移中,我需要将例如guava代码更改为java 8更改.所以,我正在做的改变是这样的:
List<Integer> naturals = Lists.newArrayList(1,2,3,4,5,6,7,8,9,10,11,12,13);
Function <Integer, Integer> duplicate = new Function<Integer, Integer>(){
@Override
public Integer apply(Integer n)
{
return n * 2;
}
};
Collection result = Collections2.transform(naturals, duplicate);
Run Code Online (Sandbox Code Playgroud)
至...
List<Integer> result2 = naturals.stream()
.map(n -> n * 2)
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
使用guava我调试代码非常容易,因为我可以调试每个转换过程,但我关心的是如何调试例如.map(n -> n*2).
使用调试器我可以看到一些代码,如:
@Hidden
@DontInline
/** Interpretively invoke this form on the given arguments. */
Object interpretWithArguments(Object... argumentValues) throws Throwable {
if (TRACE_INTERPRETER)
return interpretWithArgumentsTracing(argumentValues);
checkInvocationCounter();
assert(arityCheck(argumentValues));
Object[] …Run Code Online (Sandbox Code Playgroud) 假设我有一个通用接口:
interface MyComparable<T extends Comparable<T>> {
public int compare(T obj1, T obj2);
}
Run Code Online (Sandbox Code Playgroud)
一个方法sort:
public static <T extends Comparable<T>>
void sort(List<T> list, MyComparable<T> comp) {
// sort the list
}
Run Code Online (Sandbox Code Playgroud)
我可以调用此方法并将lambda表达式作为参数传递:
List<String> list = Arrays.asList("a", "b", "c");
sort(list, (a, b) -> a.compareTo(b));
Run Code Online (Sandbox Code Playgroud)
那会很好.
但现在如果我使接口非泛型,并且方法通用:
interface MyComparable {
public <T extends Comparable<T>> int compare(T obj1, T obj2);
}
public static <T extends Comparable<T>>
void sort(List<T> list, MyComparable comp) {
}
Run Code Online (Sandbox Code Playgroud)
然后调用它:
List<String> list = Arrays.asList("a", "b", "c");
sort(list, (a, …Run Code Online (Sandbox Code Playgroud) 由于Java8最近已经发布,并且它的全新lambda表达式看起来非常酷,我想知道这是否意味着我们习以为常的Anonymous类的消亡.
我一直在研究这个问题,并找到了一些很酷的例子,说明Lambda表达式将如何系统地替换这些类,例如Collection的sort方法,它用于获取Comparator的Anonymous实例来执行排序:
Collections.sort(personList, new Comparator<Person>(){
public int compare(Person p1, Person p2){
return p1.firstName.compareTo(p2.firstName);
}
});
Run Code Online (Sandbox Code Playgroud)
现在可以使用Lambdas完成:
Collections.sort(personList, (Person p1, Person p2) -> p1.firstName.compareTo(p2.firstName));
Run Code Online (Sandbox Code Playgroud)
而且看起来非常简洁.所以我的问题是,有没有理由继续在Java8中使用这些类而不是Lambdas?
编辑
同样的问题,但在相反的方向,使用Lambdas而不是匿名类有什么好处,因为Lambdas只能用于单个方法接口,这个新功能只是在少数情况下使用的快捷方式还是真的有用?
我目前有一个声明如下的页面:
public partial class MyPage : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//snip
MyButton.Click += (o, i) =>
{
//snip
}
}
}
Run Code Online (Sandbox Code Playgroud)
我最近才从1.1迁移到.NET 3.5,所以我习惯在Page_Load之外编写事件处理程序.我的问题是; 在使用lambda方法时,我应该注意哪些性能缺陷或缺陷?我更喜欢它,因为它当然更简洁,但我不想牺牲性能来使用它.谢谢.
我有一个包含一些User对象的列表,我正在尝试对列表进行排序,但只能使用方法引用,使用lambda表达式,编译器会给出错误:
List<User> userList = Arrays.asList(u1, u2, u3);
userList.sort(Comparator.comparing(u -> u.getName())); // works
userList.sort(Comparator.comparing(User::getName).reversed()); // works
userList.sort(Comparator.comparing(u -> u.getName()).reversed()); // Compiler error
Run Code Online (Sandbox Code Playgroud)
错误:
com\java8\collectionapi\CollectionTest.java:35: error: cannot find symbol
userList.sort(Comparator.comparing(u -> u.getName()).reversed());
^
symbol: method getName()
location: variable u of type Object
1 error
Run Code Online (Sandbox Code Playgroud)