在C++中,你可以像这样声明lambdas:
int x = 5;
auto a = [=]() mutable { ++x; std::cout << x << '\n'; };
auto b = [&]() { ++x; std::cout << x << '\n'; };
Run Code Online (Sandbox Code Playgroud)
两个都让我修改x,那有什么区别?
鉴于元素的列表,我想用一个给定的属性来获取元素,并从列表中删除.我找到的最佳解决方案是:
ProducerDTO p = producersProcedureActive
.stream()
.filter(producer -> producer.getPod().equals(pod))
.findFirst()
.get();
producersProcedureActive.remove(p);
Run Code Online (Sandbox Code Playgroud)
是否可以在lambda表达式中组合get和remove?
我可以找到很多东西向我展示lambda函数是什么,以及语法如何工作以及什么不是.但除了"酷感因素"(我可以在中间调用另一个函数,整齐!)我还没有看到过于令人信服的事情,说明为什么我真的需要/想要使用它们.
在我见过的大多数例子中,它似乎更像是一种风格或结构选择.并且有点打破了python规则中的"只有一种正确的做法".它如何使我的程序更正确,更可靠,更快速或更容易理解?(我见过的大多数编码标准都倾向于告诉你在单行上避免过于复杂的语句.如果它更容易阅读则将其分解.)
该invokedynamic指令用于帮助VM在运行时确定方法引用,而不是在编译时对其进行硬连线.
这对于动态语言很有用,其中确切的方法和参数类型在运行时才知道.但Java lambda不是这种情况.它们被转换为具有明确定义的参数的静态方法.并且可以使用此方法调用此方法invokestatic.
那么invokedynamiclambda 的需求是什么,尤其是在性能受到影响的情况下?
我正在使用Java 8 lambdas并希望Collectors toMap用来返回一个SortedMap.我能想出的最好的是调用下面Collectors toMap用假设法mergeFunction和mapSupplier等于TreeMap::new.
public static <T, K, U, M extends Map<K, U>>
Collector<T, ?, M> toMap(Function<? super T, ? extends K> keyMapper,
Function<? super T, ? extends U> valueMapper,
BinaryOperator<U> mergeFunction,
Supplier<M> mapSupplier) {
BiConsumer<M, T> accumulator = (map, element) -> map.merge(keyMapper.apply(element),
valueMapper.apply(element), mergeFunction);
return new CollectorImpl<>(mapSupplier, accumulator, mapMerger(mergeFunction), CH_ID);
}
Run Code Online (Sandbox Code Playgroud)
我不想传递合并函数,正如我想要throwingMerger()的那样,与基本toMap实现相同,如下所示:
public static <T, K, U>
Collector<T, ?, Map<K, U>> toMap(Function<? …Run Code Online (Sandbox Code Playgroud) 常规函数可以在其定义中包含对自身的调用,没问题.我无法弄清楚如何使用lambda函数来做这件事,原因很简单,因为lambda函数没有可以引用的名称.有办法吗?怎么样?
如果我有产品.
var p = new Product { Price = 30 };
Run Code Online (Sandbox Code Playgroud)
我有以下linq查询.
var q = repo.Products().Where(x=>x.Price == p.Price).ToList()
Run Code Online (Sandbox Code Playgroud)
在IQueryable提供程序中,我得到一个包含常量表达式的p.Price的MemberExpression,但是我似乎无法从它获得值"30".
更新 我试过这个,但它似乎不起作用.
var memberExpression = (MemberExpression)GetRootConstantExpression(m);
var fi = (PropertyInfo)memberExpression.Member;
var val = fi.GetValue(((ConstantExpression)memberExpression.Expression).Value, null);
Run Code Online (Sandbox Code Playgroud)
干杯.
我想把一个转换anonymous class成一个lambda expression.但这个匿名类我使用this关键字.
例如,我写了这个简单的Observer/Observable模式:
import java.util.ArrayList;
import java.util.Collection;
public static class Observable {
private final Collection<Observer> notifiables = new ArrayList<>();
public Observable() { }
public void addObserver(Observer notifiable) { notifiables.add(notifiable); }
public void removeObserver(Observer notifiable) { notifiables.add(notifiable); }
public void change() {
notifiables.forEach(notifiable -> notifiable.changed(this));
}
}
public interface Observer {
void changed(Observable notifier);
}
Run Code Online (Sandbox Code Playgroud)
这个带有匿名类的示例代码(使用this关键字):
public class Main {
public static void main(String[] args) {
Observable observable = new Observable();
observable.addObserver(new …Run Code Online (Sandbox Code Playgroud) 为什么供应商只支持no-arg构造函数?
如果存在默认构造函数,我可以这样做:
create(Foo::new)
Run Code Online (Sandbox Code Playgroud)
但如果唯一的构造函数采用String,我必须这样做:
create(() -> new Foo("hello"))
Run Code Online (Sandbox Code Playgroud) java lambda functional-programming java-8 functional-interface
lambda ×10
java ×5
java-8 ×5
c# ×2
java-stream ×2
python ×2
recursion ×2
bytecode ×1
c++ ×1
c++11 ×1
collectors ×1
jvm ×1
linq ×1
y-combinator ×1