最近我正在学习Java8个特性,所以我从lambda表达式开始,然后我遇到了Java流API,现在我正在尝试围绕流API中的方法,它们是如何工作的?
我对lambda表达式的理解是,如果我们想将lambda表达式传递给该方法,那么我们需要使用单个未实现的方法(Java 8接口可以有默认实现)创建一个与lambda表达式的签名匹配的接口。然后,传递lambda表达式的方法可以通过调用接口方法来执行lambda表达式。所以我可以说lambda表达式可以作为接口方法的实现。
但当我看到流API时,它有一些改变流的方法,例如下面的代码只是通过过滤小于5的整数来打印整数。
import java.util.Arrays;
import java.util.List;
public class StreamDemo {
static List<Integer> list= Arrays.asList(new Integer(1), new Integer(2), new Integer(3), new Integer(4), new Integer(5), new Integer(6));
public static void main(String[] ar) {
list.parallelStream()
.filter( x-> x<5)
.forEach(System.out::print);
}
}
但我不了解过滤器是如何工作的,因为它没有实现,我试图从Intellij中看到实现,它将我带到流接口,其中过滤器是采用参数谓词引用的未实现方法,但没有谓词方法<代码>布尔测试(T T T)的方法调用 那么Java是如何评估结果的,类似地,还有一种方法distinct,它没有实现,但仍然能给出准确的结果。
提前谢谢。
Stream
只是一个接口,就像List
一样。在运行时Java选择一个完成这项工作的实现。如果您想知道过滤器方法是如何实现的,您可以在java.util.stream.参考管道#过滤器
中找到一个示例。
我希望这能回答你的问题。
我最近开始在一个项目中使用MapStruct映射工具。过去,为了映射DTO->实体,反之亦然,我使用自定义映射器,例如: 在尝试获取一个可选对象时,我可以通过以下方式将实体映射到dto: 目前,正如我之前提到的,我使用的是mapStruct,问题是我的映射器是这样的,而不是类,它是这样的接口: 我想知道是否可以在stream gentle中使用这个接口方法来映射我的值,而不需要包装值,比如: 谢谢
如果我从集合界面有两个对象列表 列表1={约翰,蒂姆,汤姆} 列表2={约翰,蒂姆} 这两个列表都是ArrayList的实例 Java怎么知道list2是否包含在list1中,list1.containsall(list2)? 我知道Java使用包含方法内部实现的容器()方法,和包含方法使用相等()方法。我理解差异,但我不确定Java如何遍历列表1的元素。 如果我使用列表1。containsAll
我在读有效的Java课本。第一项是关于使用静态工厂方法而不是公共构造函数。我的疑问是,如果我正在指定我如何在中指定静态工厂方法?因为Java不支持内部的静态方法。教材指定了如何创建包含公共静态工厂方法的不可实例化类。但是这些方法如何访问实现类的私有构造函数呢? 教材中说,如果要定义,请创建一个不可实例化的类,并在该类中包含静态工厂方法。但是类中定义的方法如何访问具体实现的私有构造函数 编辑:-以下
这段代码过滤调用流,然后打印所有大于10的元素。谓词中的测试方法为我们做到了这一点。 但是filter()方法的实际实现在哪里呢?该方法返回的“流”大于10?我不明白。 这个问题在某种程度上也适用于forEach()方法。它如何在流中迭代?因为filter()和forEach()方法在接口流中是抽象的,没有实现。
问题内容: 据我了解,如果您使用Java实现接口,则实现该接口的子类必须使用该接口中指定的方法。 我注意到在某些接口(例如Collection接口)中,有一些方法被注释为可选方法,但这究竟意味着什么?我觉得接口中指定的所有方法都需要吗? 问题答案: 这里的答案似乎有很多混乱。 Java语言要求接口中的每种方法都必须由该接口的每种实现来实现。期。 这条规定没有例外。 说“收藏是一个例外”,这表明对这
我试图使用以下代码理解Java接口中的默认方法,但我无法编译它: 编译器生成了以下输出: 我无法理解这些错误。我如何更正代码中的问题?