精华内容
下载资源
问答
  • 对于中间操作和终端操作的定义,请看《JAVA8 stream接口 中间操作和终端操作》,这篇主要讲述的是stream的min,max,findFirst,findAny操作,我们先看下函数的定义 Optional<T> min(Comparator<? super...

    对于中间操作和终端操作的定义,请看《JAVA8 stream接口 中间操作和终端操作》,这篇主要讲述的是stream的min,max,findFirst,findAny操作,我们先看下函数的定义

    	Optional<T> min(Comparator<? super T> comparator);  
      
        Optional<T> max(Comparator<? super T> comparator);
    	
    	Optional<T> findFirst();  
      
        Optional<T> findAny();

    这4个函数,都是返回的Optional对象,关于这个对象,如果有不清楚的,后期我们会做详细的介绍,现在只需要知道,这个类是对null做处理的,就可以了;

    通过函数的定义,我们其实,已经可以看到,这4个函数的作用了,min和max传入的是一个Comparator这个是一个对比接口,那么返回就是根据比较的结果,取到的集合里面,最大的值,和最小的值;

    findFirst和findAny,通过名字,就可以看到,对这个集合的流,做一系列的中间操作后,可以调用findFirst,返回集合的第一个对象,findAny返回这个集合中,取到的任何一个对象;通过这样的描述,我们也可以知道,在串行的流中,findAny和findFirst返回的,都是第一个对象;而在并行的流中,findAny返回的是最快处理完的那个线程的数据,所以说,在并行操作中,对数据没有顺序上的要求,那么findAny的效率会比findFirst要快的;下面,我们通过案例,介绍这几个的用法;

      List<String> strs = Arrays.asList("d", "b", "a", "c", "a");
            Optional<String> min = strs.stream().min(Comparator.comparing(Function.identity()));
            Optional<String> max = strs.stream().max((o1, o2) -> o1.compareTo(o2));
            System.out.println(String.format("min:%s; max:%s", min.get(), max.get()));// min:a; max:d
    
            Optional<String> aa = strs.stream().filter(str -> !str.equals("a")).findFirst();
            Optional<String> bb = strs.stream().filter(str -> !str.equals("a")).findAny();
    
            Optional<String> aa1 = strs.parallelStream().filter(str -> !str.equals("a")).findFirst();
            Optional<String> bb1 = strs.parallelStream().filter(str -> !str.equals("a")).findAny();
    
            System.out.println(aa.get() + "===" + bb.get());// d===d
            System.out.println(aa1.get() + "===" + bb1.get());// d===b or d===c

    可以看到在min和max中,两种不同的写法,Function.identity(),表示当前对象String本身,如果集合里,是其他的实体类对象,那么可以根据实体类对象里的具体成员进行对象

    后面的findFirst和findAny也都在串行和并行中,都有解释;最后Optional的get方法,是取到这个对象,这里的是String,取出来的就是字符串

     

     

    1.lambda表达式

    《java8 Lambda表达式简介》

    《java8 lambda表达式,方法的引用以及构造器的引用》

    2.函数式接口

    《java8 函数式接口简介》

    《JAVA8 Function接口以及同类型的特化的接口》

    《JAVA8 Consumer接口》

    《JAVA8 Supplier接口》

    《JAVA8 UnaryOperator接口》

    《JAVA8 BiConsumer 接口》

    3.stream接口操作

    《java8 Stream接口简介》

    《 java8 Stream-创建流的几种方式》

    《JAVA8 stream接口 中间操作和终端操作》

    《JAVA8 Stream接口,map操作,filter操作,flatMap操作》

    《JAVA8 stream接口 distinct,sorted,peek,limit,skip》

    《java8 stream接口 终端操作 forEachOrdered和forEach》

    《java8 stream接口 终端操作 toArray操作》

    《java8 stream接口 终端操作 min,max,findFirst,findAny操作》

    《java8 stream接口终端操作 count,anyMatch,allMatch,noneMatch》

    《java8 srteam接口终端操作reduce操作》

    《java8 stream接口 终端操作 collect操作》

    4.其他部分

    《java8 Optional静态类简介,以及用法》

     

    展开全文
  • FindFirst

    2012-01-17 21:39:55
    Unit: SysUtils Delphi 语法: function FindFirst(const Path: ...FindFirst函数查找由Path参数指定的目录中的第一个匹配Path中隐含的文件名并且符合Attr参数属性的文件,由参数F将结果返回。如果成功找到文件Fin
    
    
    Unit: SysUtils

    Delphi 语法:

    function FindFirst(const Path: string; Attr: Integer; var F: TSearchRec): Integer;


    FindFirst函数查找由Path参数指定的目录中的第一个匹配Path中隐含的文件名并且符合Attr参数属性的文件,由参数F将结果返回。如果成功找到文件FindFirst函数将返回0,否则返回一个错误码。
    Path中可以使用通配符,例如'.\test\*.*'

    Attr参数是常量枚举,可以有下列值:
    Constant                    Description
    faReadOnly    Read-only files
    faHidden                    Hidden files
    faSysFile                    System files
    faVolumeID    Volume ID files
    faDirectory    Directory files
    faArchive                    Archive files
    faAnyFile                    Any file
    Delphi中属性可以相加,例如查找只读且隐藏文件使用faReadOnly + faHidden 
    注意:FindFirst分配的资源必须使用FindClose释放掉。


    ----------------------------------------------------------------------------------------
    功能说明:删除指定的文件。该函数只有一个参数。此参数为欲删除文件的完整路径。如果删除成功,则返回True。若删除失败、或文件不存在则返回False。
      参考实例:
      var
        IsOK: Boolean; // 用于保存删除状态
      begin
        IsOK := DeleteFile('C:\My Documents\Index.html'); // 函数执着后,将结果返回给IsOK变量。如果IsOK变量为True,则表示文件删除成功。
        if IsOK then ShowMessage('文件删除成功!')
        else ShowMessage('文件删除失败!');
      end;
    展开全文
  • findfirst 过滤Java 8 Stream ,通常使用findFirst()或findAny()来获取在过滤器中幸存的元素。 但这可能并不能真正实现您的意思,并且可能会出现一些细微的错误。 那么 从我们的Javadoc( 此处和此处 )可以看出...

    findfirst

    过滤Java 8 Stream ,通常使用findFirst()findAny()来获取在过滤器中幸存的元素。 但这可能并不能真正实现您的意思,并且可能会出现一些细微的错误。

    那么

    从我们的Javadoc( 此处此处 )可以看出,这两种方法都从流中返回任意元素-除非流具有遇到顺序 ,在这种情况下, findFirst()返回第一个元素。 简单。

    一个简单的示例如下所示:

    public Optional<Customer> findCustomer(String customerId) {
    	return customers.stream()
    			.filter(customer -> customer.getId().equals(customerId))
    			.findFirst();
    }

    当然,这只是旧的for-each-loop的漂亮版本:

    public Optional<Customer> findCustomer(String customerId) {
    	for (Customer customer : customers)
    		if (customer.getId().equals(customerId))
    			return Optional.of(customer);
    	return Optional.empty();
    }

    但是,这两种变体都包含相同的潜在错误:它们是基于隐含的假设建立的,即只有一个具有任何给定ID的客户。

    现在,这可能是一个非常合理的假设。 也许这是一个已知的不变式,由系统的专用部分保护,并由其他人员依赖。 在这种情况下,这完全可以。

    通常,代码依赖于唯一的匹配元素,但没有做任何断言。

    但是在很多情况下,我不是在野外看到的。 也许客户只是从外部来源加载的,这些来源无法保证其ID的唯一性。 也许现有的错误允许两本书具有相同的ISBN。 也许搜索词允许出乎意料的许多意外匹配(有人说过正则表达式吗?)。

    通常,代码的正确性取决于以下假设:存在与条件匹配的唯一元素,但它不执行或断言该元素。

    更糟糕的是,不当行为完全是由数据驱动的,可能会在测试期间将其隐藏。 除非考虑到这种情况,否则我们可能会完全忽略它,直到它在生产中出现为止。

    更糟糕的是,它默默地失败了! 如果只有一个这样的元素的假设被证明是错误的,我们将不会直接注意到这一点。 取而代之的是,系统会在观察到影响并查明原因之前微妙地运行一段时间。

    因此,当然, findFirst()findAny()本质上没有错。 但是,使用它们很容易导致建模域逻辑中的错误。

    快速失败

    因此,让我们解决这个问题! 假设我们非常确定最多有一个匹配元素,如果没有,我们希望代码快速失败 通过循环,我们必须管理一些难看的状态,它看起来如下:

    public Optional<Customer> findOnlyCustomer(String customerId) {
    	boolean foundCustomer = false;
    	Customer resultCustomer = null;
    	for (Customer customer : customers)
    		if (customer.getId().equals(customerId))
    			if (!foundCustomer) {
    				foundCustomer = true;
    				resultCustomer = customer;
    			} else {
    				throw new DuplicateCustomerException();
    			}
     
    	return foundCustomer
    			? Optional.of(resultCustomer)
    			: Optional.empty();
    }

    现在,流为我们提供了更好的方法。 我们可以使用经常被忽略的reduce, 文档中对此

    执行减少有关此流的元件,使用缔合累积功能,并返回一个可选描述的缩小值,如果有的话。 这等效于:

    流减少

    boolean foundAny = false;
    T result = null;
    for (T element : this stream) {
        if (!foundAny) {
            foundAny = true;
            result = element;
        }
        else
            result = accumulator.apply(result, element);
    }
    return foundAny ? Optional.of(result) : Optional.empty();

    但不限于顺序执行。

    看起来不像上面的循环吗?! 疯狂的巧合...

    因此,我们需要的是一个累加器,该累加器会在调用后立即抛出所需的异常:

    public Optional<Customer> findOnlyCustomerWithId_manualException(String customerId) {
    	return customers.stream()
    			.filter(customer -> customer.getId().equals(customerId))
    			.reduce((element, otherElement) -> {
    				throw new DuplicateCustomerException();
    			});
    }

    这看起来有些奇怪,但它确实可以满足我们的要求。 为了使它更具可读性,我们应该将其放入Stream实用工具类中并给它起一个漂亮的名字:

    public static <T> BinaryOperator<T> toOnlyElement() {
    	return toOnlyElementThrowing(IllegalArgumentException::new);
    }
     
    public static <T, E extends RuntimeException> BinaryOperator<T>
    toOnlyElementThrowing(Supplier<E> exception) {
    	return (element, otherElement) -> {
    		throw exception.get();
    	};
    }

    现在我们可以这样称呼它:

    // if a generic exception is fine
    public Optional<Customer> findOnlyCustomer(String customerId) {
    	return customers.stream()
    			.filter(customer -> customer.getId().equals(customerId))
    			.reduce(toOnlyElement());
    }
     
    // if we want a specific exception
    public Optional<Customer> findOnlyCustomer(String customerId) {
    	return customers.stream()
    			.filter(customer -> customer.getId().equals(customerId))
    			.reduce(toOnlyElementThrowing(DuplicateCustomerException::new));
    }

    目的显示代码如何?

    这将实现整个流。

    应该注意的是,与findFirst()findAny() ,这当然不是短路操作 ,它将实现整个流。 也就是说,如果确实只有一个元素。 当然,一旦遇到第二个元素,处理就会停止。

    反射

    我们已经看到findFirst()findAny()如何不足以表示流中最多剩余一个元素的假设。 如果我们要表达该假设,并确保在违反该代码时快速失败,则需要reduce(toOnlyElement())

    首先感谢Boris Terzic使我意识到这种意图不匹配。

    翻译自: https://www.javacodegeeks.com/2016/02/beware-findfirst-findany.html

    findfirst

    展开全文
  • Java8中findAny和findFirst的区别

    万次阅读 2019-10-29 20:31:11
    试验了一下java stream中的findAny和findFirst,发现都返回了列表中的第一个元素。那么,这两种方法的区别是什么呢? 查看了一下Java API document: findFirstfindFirst Optional<T>findFirst() ...

    试验了一下java stream中的findAny和findFirst,发现都返回了列表中的第一个元素。那么,这两种方法的区别是什么呢?

    查看了一下Java API document:

    findFirst:

    findFirst

    Optional<T> findFirst()

    Returns an Optional describing the first element of this stream, or an empty Optional if the stream is empty. If the stream has no encounter order, then any element may be returned.

    This is a short-circuiting terminal operation.

    Returns:

    an Optional describing the first element of this stream, or an empty Optional if the stream is empty

    Throws:

    NullPointerException - if the element selected is null

    顾名思义,即返回列表中的第一个元素。

    这里的short-circuiting是指:有时候需要在遍历中途停止操作,比如查找第一个满足条件的元素或者limit操作。在Stream中short-circuiting操作有:anyMatch、allMatch、noneMatch、findFirst、findAny、limit,这些操作在Sink中都有一个变量来判断是否短路,比如limit用的是m,match用的是stop,find用的是hasValue。

    这里的terminal operation是指:一个终结操作,比如foreach,IntStream.sum

    那么,findAny是什么呢?

    findAny

    Optional<T> findAny()

    Returns an Optional describing some element of the stream, or an empty Optional if the stream is empty.

    This is a short-circuiting terminal operation.

    The behavior of this operation is explicitly nondeterministic(不确定的); it is free to select any element in the stream. This is to allow for maximal performance in parallel operations; the cost is that multiple invocations(调用) on the same source may not return the same result. (If a stable result is desired, use findFirst() instead.)

    Returns:

    an Optional describing some element of this stream, or an empty Optional if the stream is empty

    Throws:

    NullPointerException - if the element selected is null

    See Also:

    findFirst()

    可以看到findAny()操作,返回的元素是不确定的,对于同一个列表多次调用findAny()有可能会返回不同的值。使用findAny()是为了更高效的性能。如果是数据较少,串行地情况下,一般会返回第一个结果,如果是并行的情况,那就不能确保是第一个。比如下面的例子会随机地返回OptionalInt[50]。

    System.out.println(IntStream.range(0, 100).parallel().findAny());

    让我们来举另外一个例子:

    List<String> lst1 = Arrays.asList("Jhonny", "David", "Jack", "Duke", "Jill","Dany","Julia","Jenish","Divya");
    List<String> lst2 = Arrays.asList("Jhonny", "David", "Jack", "Duke", "Jill","Dany","Julia","Jenish","Divya");
    
    Optional<String> findFirst = lst1.parallelStream().filter(s -> s.startsWith("D")).findFirst();
    Optional<String> fidnAny = lst2.parallelStream().filter(s -> s.startsWith("J")).findAny();
    
    System.out.println(findFirst.get()); //总是打印出David
    System.out.println(fidnAny.get()); //会随机地打印出Jack/Jill/Julia

    参考链接:

    1. https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#findFirst--

    2. https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#findAny--

    3. https://stackoverflow.com/questions/35359112/difference-between-findany-and-findfirst-in-java-8

    展开全文
  • 今天我们来聊聊流失编程中的findAny和findFirst。01findAny与findFirst二者的功能从二者的名字我们就能看出他们大概的功能了。findFirst是从流中找出第一个元素。而findAny则是从流中找出任意一个元素。是这样吗?...
  • findfirst,、findnext 、_findfirst、 _findnext搜索磁盘目录 #include "stdafx.h" #include &lt;iostream&gt; #include &lt;Windows.h&gt; #include &lt;string&gt; #include ...
  • _findfirst函数

    2020-11-27 09:42:29
    1、 _findfirst函数是用来查询文件名的 2、代码 const char* to_search = "*.DAT"; //欲查找的文件目录 int main() { long handle; //用于查找的句柄 struct _finddata_t fileinfo; //文件信息的结构体 fp = f
  • Delphi数据库操作FindFirst方法实例..rar
  • 查看了一下Java API document:findFirst:findFirstOptionalfindFirst()Returns anOptionaldescribing the first element of this stream, or an emptyOptionalif the stream is empty. If the stream has no ...
  • Java 8 Stream findFirst()和findAny()

    千次阅读 2020-06-03 21:12:04
    在Java 8 Stream中, findFirst()返回Stream中的第一个元素,而findAny()返回Stream中的任何元素。 1. findFirst() 1.1从整数流中找到第一个元素。 Java8FindFirstExample1.java package com.mkyong.java8...
  • Find first occurrence

    2020-12-09 00:27:45
    <div><p>How can I find the first element that matches the regex? Thank you...</p><p>该提问来源于开源项目:facelessuser/RegReplace</p></div>
  • 过滤Java 8 Stream ,通常使用findFirst()或findAny()来获取在过滤器中幸存的元素。 但这可能并不能真正实现您的意思,并且可能会出现一些细微的错误。 那么 从我们的Javadoc( 此处和此处 )可以看出,这两个方法...
  • 这些函数和结构体在的头文件中,结构体为struct _finddata_t ,函数为_findfirst、_findnext和_fineclose。具体如何使用,下面来一起看看吧 _findfirst与_findnext查找文件 一、这两个函数均在io.h里面。 二、首先...
  • Java List Stream的findAny和findFirst的区别

    万次阅读 2019-05-13 11:34:05
    今天测试了一下Stream.findAny的结果,发现总是返回列表的第一个元素,结果和findFirst一样 搜了一下发现findAny并不是随机地选一个,如果是数据较少,串行地情况下,一般会返回第一个结果,如果是并行的情况,那就...
  • Optional<T> min(Comparator<? super T> comparator); Optional<T> max(Comparator<? super T>... findFirst();...findFirst和findAny,通过名字,就可以看到,对这个集合的流,做一系
  • Java-8 Stream findFirst() 和 findAny() 2019年06月14日 pj Java-8 1.简介 Java 8 Stream API引入了两种经常被误解的方法:findAny()和findFirst()。 在本教程中,我们将研究这两种方法之间的区别以及何时使用...
  • Delphi——FindFirst学习

    2017-03-30 14:35:42
    FindFirst在SysUtils中声明 原型为 Fucntion FindFirst(const Path:String;Attr:Integer;Var F:TSearchRec):Integer; 描述: 从指定的目录中搜索第一个给定属性文件实例 返回结果保存到参数F中,F参数是一个文件...
  • <p>Upon viewing other controllers, it seems that other edit functions such as that on the ProductsController use Model::findFirst() as opposed to Model::findFirstById(). <p>Please correct me if I'...
  • _findfirst和_findnext

    2017-04-18 08:44:00
    2、_findfirst函数:long _findfirst(const char *, struct _finddata_t *); 第一个参数为文件名,第二个参数为_finddata结构体指针,若成功,则返回文件的句柄。 3、_findnext函数:int _findnext(long, struct ...
  • findFirstMissingPositive

    2015-09-13 20:43:22
    void bucket_sort(int A[],int n) { for(size_t i=0;i { while(A[i]!=i+1) { if(A[i]n||A[i]==A[A[i]-1]) break; swap(A[i],A[A[i]-1]);...int findFirstMissingPositive(int A[],int n) { bucket
  • findfirst, findnext

    2009-03-12 14:58:00
    findfirst, findnext 函数名: findfirst, findnext 功能: 搜索磁盘目录; 取得下一个匹配的findfirst模式的文件 用法: int findfirst(char *pathname, struct ffblk *ffblk, int attrib); ...
  • delphi 模糊查找文件 findfirst findnext 如 路径一: D:\TEST1\TESTX1.LOG 路径二: D:\TEST2\TESTX2.LOG 要求实现功能: 搜索D:\路径,可以同时搜到TESTX1.LOG, TESTX2.LOG
  • Find first" <p>2.) Open a new tab and enter the following text: aaa bbb aaa bbb aaa bbb aaa bbb <p>3.) Go to line 1, column 1 <p>4.) Press Ctrl+F <p>5.) Type: aaa <p>5.) Press F8 <p>...
  • Find first set

    2017-05-27 13:55:41
    https://en.wikipedia.org/wiki/Find_first_set#CLZ

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 57,214
精华内容 22,885
关键字:

findfirst