您好,歡迎來到賦能網(wǎng)!

java函數(shù)式編程使用場景是什么?java函數(shù)式編程使用場景

賦能網(wǎng) 2023-05-09 55

java函數(shù)式編程其實(shí)就是在一個接口中有一個抽象方法的接口,稱為函數(shù)式接口,當(dāng)然接口可以包含其他的方法,比如默認(rèn)、靜態(tài)、私有,那java函數(shù)式編程使用場景是什么?下面來我們就來給大家講解一下。

首先,我們先定義一個函數(shù)式編程接口

@FunctionalInterfacepublic interface BooleanFunctionalInterface
{
    boolean test(T t);
}

很簡單,該接口的唯一一個抽象方法(并且非Object類的方法)返回值為boolean

下面,定義一個方法,接受一個List,利用實(shí)現(xiàn)了該接口的test方法的對象,篩選出需要的元素:

import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;
public class Filter
{
    public staticListfilter(Listlist, BooleanFunctionalInterface b)
    {
        if (CollectionUtils.isEmpty(list))
        {
            return new ArrayList < > (0);
        }
        Listresult = new ArrayList < > (list.size());
        for (int i = 0; i < list.size(); p = ""
            i++)
        {
            <= "" >
            T t = list.get(i);
            if (b.test(t))
            {
                result.add(t);
            }
        }
        return result;
    }
}

測試類,篩選出年齡大于25的People對象:

public class FunctionalInterfaceTest
{
    private ListpeopleList = new ArrayList < > ();
    @Before
    public void init()
    {
        peopleList.add(new People("LuoTianyan", 23));
        peopleList.add(new People("ff", 26));
        peopleList.add(new People("Tony", 33));
    }
    
    @Test
    public void testUserDefined()
    {
        Listfilter = Filter.filter(peopleList, p - > ((People) p)
            .getAge() > 25);
        filter.forEach(System.out::println);
        
    }
}
import lombok.*;
@Getter
@Setter
@ToString
@AllArgsConstructor
@NoArgsConstructorpublic class People
{
    private String name;
    private int age;
}

JDK中已有的函數(shù)式接口

上面的自定義的函數(shù)式接口,返回boolean,其實(shí)在Java8中已經(jīng)有該類型的接口,那就是Predicate。

Predicate接口

該接口定義了一個支持泛型的boolean test( T)的抽象方法,其函數(shù)描述符為 (T)-> boolean,現(xiàn)在我們就可以直接使用Predicate接口來替代上面自定義的接口了。

在上面的Filter類中追加一個方法,修改這里形參為Predicate。

public staticListpredicate(Listlist, Predicate predicate)
{
    if (CollectionUtils.isEmpty(list))
    {
        return new ArrayList < > (0);
    }
    Listresult = new ArrayList < > (list.size());
    for (int i = 0; i < list.size(); p = ""
        i++)
    {
        <= "" >
        T t = list.get(i);
        if (predicate.test(t))
        {
            result.add(t);
        }
    }
    return result;
}

獲取Age>25的People對象,測試如下:

@Test
public void testPredicate()
{
    Listpredicate = Filter.predicate(peopleList, p - > ((People) p)
        .getAge() > 25);
    predicate.forEach(System.out::println);
}

Consumer接口

該接口定義了一個void accept(T)的抽象方法,其函數(shù)描述符為 (T) -> void,如果你需要一個操作某一對象,但無需返回的的函數(shù)式接口,那么就可以使用Consumer接口。

追加方法,形參為Consumer:

public staticvoid consumer(Listlist, Consumer consumer)
{
    if (CollectionUtils.isEmpty(list))
    {
        return;
    }
    Listresult = new ArrayList < > (list.size());
    for (int i = 0; i < list.size(); p = ""
        i++)
    {
        <= "" >
        T t = list.get(i);
        consumer.accept(t);
    }
}

下面實(shí)現(xiàn)修改所有Age為18,并且輸出,測試如下:

@Test
public void testConsumer()
{
    // setAge操作不需要返回值
    ConsumersetAgeConsumer = p - > ((People) p)
        .setAge(18);
    Filter.consumer(peopleList, setAgeConsumer);
    // 輸出操作不需要返回值
    Consumersout = p - > System.out.println((People) p);
    Filter.consumer(peopleList, sout);
    
}

Supplier接口

既然有消費(fèi)者接口(Consumer),那就要有生產(chǎn)者接口(Supplier),該接口定義了一個 T get() 的抽象方法,其函數(shù)描述符為 () -> T,如果不接受入?yún)?,直接為我們生產(chǎn)一個指定的結(jié)果,那么就可以用Supplier。

追加方法,形參Supplier

public staticListlistFactory(int count, Suppliersupplier)
{
    Listresult = new ArrayList < > (count);
    for (int i = 0; i < count; p = ""
        i++)
    {
        <= "" >
        T t = supplier.get();
        result.add(t);
    }
    return result;
}

下面生成count個對象,設(shè)置對象默認(rèn)屬性值:

@Test
public void testSupplier()
{
    // 生成對象
    SupplierpeopleSupplier = () - > new People("init", 18);
    Listpeople = Filter.listFactory(5, peopleSupplier);
    // 輸出操作不需要返回值
    Consumersout = p - > System.out.println((People) p);
    Filter.consumer(people, sout);
    
}

Function接口

該接口定義了一個 R apply(T)類型的抽象函數(shù),它接受一個泛型變量T,并返回一個泛型變量R,如果你需要將一個對象T映射成R,那么就可以使用Function接口。

下面,我們將對象轉(zhuǎn)化為String類型的例子

public staticListfunction(Listlist, Functionfunction)
{
    if (CollectionUtils.isEmpty(list))
    {
        return new ArrayList < > (0);
    }
    Listresult = new ArrayList < > (list.size());
    for (int i = 0; i < list.size(); p = ""
        i++)
    {
        <= "" >
        T t = list.get(i);
        String apply = function.apply(t);
        result.add(apply);
    }
    return result;
}

將People對象,轉(zhuǎn)換為的字符串輸出:

@Test
public void testFunction()
{
    // 將People對象,轉(zhuǎn)換為如下形式的字符串
    Functionfunction = (People p) - > "name:" + p.getName() + " , age:" + p.getAge();
    Liststrings = Filter.function(peopleList, function);
    // 輸出操作不需要返回值
    Consumersout = p - > System.out.println(p);
    Filter.consumer(strings, sout);
    
}

上面代碼的優(yōu)化

由于上面的people是list集合,可以直接利用stream的形式;

比如People對象轉(zhuǎn)換成字符串

@Test

public void testListStream()
{
    Listcollect = peopleList.stream()
        .map(p - > p.getName() + p.getAge())
        .collect(Collectors.toList());
    collect.forEach(System.out::println);
    
}

java函數(shù)式編程能夠減少了可變量的聲明,進(jìn)行更好的利用并行,并且代碼會更加簡潔和可讀,因此java函數(shù)式編程還是很有必要的。最后大家如果想要了解更多初識java知識,敬請關(guān)注賦能網(wǎng)。


本文鏈接:

本文章“java函數(shù)式編程使用場景是什么?java函數(shù)式編程使用場景”已幫助 55 人

免責(zé)聲明:本信息由用戶發(fā)布,本站不承擔(dān)本信息引起的任何交易及知識產(chǎn)權(quán)侵權(quán)的法律責(zé)任!

本文由賦能網(wǎng) 整理發(fā)布。了解更多培訓(xùn)機(jī)構(gòu)》培訓(xùn)課程》學(xué)習(xí)資訊》課程優(yōu)惠》課程開班》學(xué)校地址等機(jī)構(gòu)信息,可以留下您的聯(lián)系方式,讓課程老師跟你詳細(xì)解答:
咨詢熱線:4008-569-579

如果本頁不是您要找的課程,您也可以百度查找一下: