Tag: lambda

从lambda对象获取MethodHandle

来自java.lang.invoke.LambdaMetafactory : 用于评估lambda表达式的推荐机制是将lambda体转移到方法,调用invokedynamic调用站点,其静态参数列表描述function接口的唯一方法和desugared实现方法,并返回一个对象(lambda对象)实现目标类型。 从检查来看,这至少是Oracle JDK的作用。 我的问题:给定一个lambda对象有没有办法找到实现方法的名称(或句柄)? 或者,给定一个实现方法列表,有没有办法告诉哪一个对应于给定的lambda对象?

在Session中使用lambda表达式

我正在编写一个Javafx应用程序,其中使用JavaMail发送电子邮件。 在创建新Session时,我使用语法。 Session session = Session.getInstance(props, //Use labmda expression? new javax.mail.Authenticator() { protected javax.mail.PasswordAuthentication getPasswordAuthentication(){ return new javax.mail.PasswordAuthentication(userName, password); } } ); 我想知道是否可以使用lambda表达式来简化它 () -> return new java.mail.PasswordAuthentiaction(userName, password) 但每当我使用它时,它会抛出不兼容的类型,并说Authenticator不是一个function界面。

Lambda表达式:引用特定对象的实例方法

此代码使用方法引用特定对象的实例方法: public class Main { public static void main(String[] args) { One one=new One(); // F f = ()->{one.bar();}; //previous wrong syntax F f = one::bar; //4 f.foo(); } } class One{void bar(){}} interface F{void foo();} 我知道它有效。 但我无法理解为什么以及如何 。 我无法理解的是F.foo()方法如何使用对不是方法本身的参数的对象的引用(签名不是void foo(One one) )。 我在第4行 创建实现F接口的类的实例 通过使用引用来调用bar()方法来实现该方法 但是foo()如何在one引用上有一个范围? 我是否错误地试图将此解决方案转换为“传统的,明确的实现”? 如果不是,“明确的对应物”是什么?

如何将参数发送到流中的引用方法(java 8)?

我有一个活动列表(活动),我想确定一个Map(String, DateTime)的表格Map(String, DateTime) (不是Duration或Period;它是必须的Map(String, DateTime)的数据结构。 对于每个活动,在监测期间计算的总持续时间。 Activity类有: activityLabel(String) , startTime(DateTime) , endTime(DateTime) 。 我用joda时间。 这就是我所做的: Map durations = activities.stream().collect(Collectors.toMap( it -> it.activityLabel, it ->new DateTime(0,0,0,0,0,0) //,DateTime::plus )); 我想我应该使用DateTime plus(ReadablePeriod period)或DateTime plus(ReadableDuration duration) ,但我不知道如何将类型为Duration或Period的参数发送到方法引用。 我怎样才能达到这个效果? 编辑:输入: 2011-12-03 01:00:00 2011-12-03 9:00:00睡觉 2011-12-04 03:00:00 2011-12-04 10:30:00睡觉 我应该有输出:睡觉0-0-0 15:30:00(年,月,日,小时,分钟,秒)

将<String,List >映射到Pair

使用Java 8 Stream API如何将一个Map到一Pair列表,其中左对值是映射键? 示例:如果给定地图是 1 => {1, 2, 3} 2 => {2, 4} 然后所需的输出是五对流: (1,1) , (1,2) , (1,3) , (2,2) , (2,4)

使用Mockito 2.0.7模拟lambda表达式

我想模拟我的存储库上提供的查询,如下所示: @Test public void GetByEmailSuccessful() { // setup mocks Mockito.when(this.personRepo.findAll() .stream() .filter(p -> (p.getEmail().equals(Mockito.any(String.class)))) .findFirst() .get()) .thenReturn(this.personOut); Mockito.when(this.communityUserRepo.findOne(this.communityUserId)) .thenReturn(this.communityUserOut); … 我的@Before方法如下所示: @Before public void initializeMocks() throws Exception { // prepare test data. this.PrepareTestData(); // init mocked repos. this.personRepo = Mockito.mock(IPersonRepository.class); this.communityUserRepo = Mockito.mock(ICommunityUserRepository.class); this.userProfileRepo = Mockito.mock(IUserProfileRepository.class); } 可悲的是,当我运行测试时,我收到错误: java.util.NoSuchElementException:没有值存在 当我双击错误时,它指向第一个lambda的.get()方法。 有没有人成功嘲笑过一个lambda表达式,知道如何解决我的问题?

映射到List

我正在尝试使用lambdas将Map转换为List 。 基本上我想将键和值连接起来,并在它们之间加上’=’ 。 这似乎微不足道,但我找不到如何做到这一点。 例如 Map map = new HashMap(); map.put(“a1″,”b1”); map.put(“a2″,”b2”); map.put(“a3″,”b3”); // Lambda // Result contains [“a1=b1”, “a2=b2”, “a3=b3”] List result;

Lambda和cast交叉类型(Eclipse编译器bug)

那么,为什么这段代码会编译? public static void main(String[] args) { Calculator test = (Calculator & Sumator) (a, b) -> a + b; System.out.println(test.calculate(2, 3)); Sumator sumator = (Calculator & Sumator) (a, b) -> a + b; // does compile, but throws an Exception sumator.test(); Both both = (Both) (a, b) -> a + b; // does not compile […]

如何使用lambda获取哈希映射中值的键数

我有一个哈希映射 Map<Integer, List> Directmap = new HashMap<Integer, List>() {{ put(0, Arrays.asList(a, b)); put(1, Arrays.asList(b, c)); put(2, Arrays.asList(d)); put(3, Arrays.asList(d, e)); put(4, Arrays.asList(e)); put(5, Arrays.asList()); }}; Directmap: {0=[a, b], 1=[b, c], 2=[d], 3=[d, e], 4=[e], 5=[]} 我想计算每个值的键数。 例如: “a”有一个键, “b”有两个键,……, “e”有两个键,即3和4。 我试过这样的事情: Map ex = Directmap.entrySet().stream() .collect(Collectors.groupingBy(e -> e.getKey(), Collectors.counting())); 我想要以键数作为输出的值。 喜欢这个 : a=[1], b=[2], c=[1], […]

Java流API将lambda表达式存储为变量

这个标题对我来说听起来很愚蠢,但必须至少有一些聪明的方法才能达到这样的效果,我不知道如何解释它。 我需要使用sorted in stream API对数组进行排序。 到目前为止,这是我的流: Arrays.stream(sequence.split(” “)) .mapToInt(Integer::parseInt) .boxed() .sorted((a, b) -> a.compareTo(b)) .forEach(a -> System.out.print(a + ” “)); 现在我有两种不同的过程 – 升序和降序,我需要使用的排序在用户输入中指定。 所以我想要做的就是切换2个案例:“升序”和“降序”以及分别存储lambda表达式的变量: switch(command) { case “ascending”: var = a.compareTo(b); case “descending”: var = b.compareTo(a); } 然后我的排序看起来像: .sorted((a, b) -> var) 我在参加的python课程中得到了这个想法。 在那里可以将对象存储在变量中,从而使变量“可执行”。 我意识到这个lambda不是一个对象,而是一个表达式,但我要问的是有什么聪明的方法可以达到这样的结果,或者我应该只有 if(var) 和每个排序顺序的两个不同的流。