当前位置: 首页 > 知识库问答 >
问题:

如何调试stream().map(...)用lambda表达式?

赵朝
2023-03-14

在我们的项目中,我们将迁移到Java8,并测试它的新特性。

在我的项目中,我使用Guava谓词和函数,使用collections2.transformcollections2.filter过滤和转换一些集合。

在这次迁移中,我需要更改例如guava代码到Java8的更改。所以,我正在做的改变是:

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);

到...

List<Integer> result2 = naturals.stream()
    .map(n -> n * 2)
    .collect(Collectors.toList());

使用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[] values = Arrays.copyOf(argumentValues, names.length);
    for (int i = argumentValues.length; i < values.length; i++) {
        values[i] = interpretName(names[i], values);
    }
    return (result < 0) ? null : values[result];
}
.map(
    n -> {
        Integer nr = n * 2;
        return nr;
    }
)

由于Stuart Marks使用方法引用的方法还允许我调试转换过程:

static int timesTwo(int n) {
    Integer result = n * 2;
    return result;
}
...
List<Integer> result2 = naturals.stream()
    .map(Java8Test::timesTwo)
    .collect(Collectors.toList());
...

由于Marlon Bernardes回答,我注意到我的Eclipse没有显示它应该显示的内容,使用peek()有助于显示结果。

共有1个答案

葛言
2023-03-14

我在使用Eclipse或IntelliJ IDEA时调试lambda表达式通常没有问题。只需设置一个断点,并确保不检查整个lambda表达式(只检查lambda正文)。

另一种方法是使用peek检查流的元素:

List<Integer> naturals = Arrays.asList(1,2,3,4,5,6,7,8,9,10,11,12,13);
naturals.stream()
    .map(n -> n * 2)
    .peek(System.out::println)
    .collect(Collectors.toList());

更新:

映射后插入换行符(将允许您只为lambda表达式设置断点。调试器不显示return语句的中间值并不罕见。将lambda更改为n->{int result=n*2;return result;}将允许您检查结果。同样,在逐行步进时适当地插入换行符…

 类似资料:
  • 在我的项目中,我使用Guava谓词和函数来使用和筛选和转换一些集合。 在这次迁移中,我需要将guava代码更改为Java8更改。所以,我所做的改变是这样的: 到... 由于,使用方法引用的方法还允许我调试转换过程: 多亏了answer,我注意到我的Eclipse没有显示它应该显示的内容,而peek()的使用有助于显示结果。

  • 本文向大家介绍Java中如何调试Lambda表达式,包括了Java中如何调试Lambda表达式的使用技巧和注意事项,需要的朋友参考一下 Lambda表达式由两部分组成,一个是参数,另一个是代码或表达式。 这两个部分由箭头运算符“->”分隔。 我们可以使用NetBeans,IntelliJ和Eclipse等不同的IDE来调试Java中的lambda表达式。 始终可以创建多行lambda表达式,并使用

  • 本文向大家介绍Java8中Lambda表达式使用和Stream API详解,包括了Java8中Lambda表达式使用和Stream API详解的使用技巧和注意事项,需要的朋友参考一下 前言 Java8 的新特性:Lambda表达式、强大的 Stream API、全新时间日期 API、ConcurrentHashMap、MetaSpace。总得来说,Java8 的新特性使 Java 的运行速度更快、

  • 本文向大家介绍Android Studio里如何使用lambda表达式,包括了Android Studio里如何使用lambda表达式的使用技巧和注意事项,需要的朋友参考一下 根目录下gradle文件配置 app下gradle文件配置 添加在project / app / build.gradle顶部的插件 在Android{…}中配置 以上所述是小编给大家介绍的Android Studio里如何

  • 我在尝试使用lambda表达式时遇到了这个错误。

  • 本文向大家介绍Python lambda表达式filter、map、reduce函数用法解析,包括了Python lambda表达式filter、map、reduce函数用法解析的使用技巧和注意事项,需要的朋友参考一下 前言 lambda是表达式,用于创建匿名函数,可以和filter、map、reduce配合使用。 本文环境Python3.7。 一、lambda表达式 lambda 只包含一个语句