首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

尝试在Java8中使用Map<类、Function<T、R>>作为instanceOf的替代,无法放入映射

在Java 8中,我们可以使用Map<Class<? extends T>, Function<T, R>>来实现instanceOf的替代。该Map存储了类型Class和对应的Function函数,其中T代表要判断的对象类型,R代表处理该对象类型的返回结果类型。

以下是一种实现方式:

代码语言:txt
复制
import java.util.HashMap;
import java.util.Map;
import java.util.function.Function;

public class InstanceOfMapper<T, R> {
    private Map<Class<? extends T>, Function<T, R>> typeMap;

    public InstanceOfMapper() {
        typeMap = new HashMap<>();
    }

    public void addMapping(Class<? extends T> clazz, Function<T, R> function) {
        typeMap.put(clazz, function);
    }

    public R apply(T obj) {
        for (Class<?> clazz : typeMap.keySet()) {
            if (clazz.isInstance(obj)) {
                return typeMap.get(clazz).apply(obj);
            }
        }
        // 没有匹配的类型
        return null;
    }
}

使用示例:

代码语言:txt
复制
public class Main {
    public static void main(String[] args) {
        InstanceOfMapper<Number, String> mapper = new InstanceOfMapper<>();

        // 添加类型和对应的处理函数
        mapper.addMapping(Integer.class, num -> "整数:" + num.intValue());
        mapper.addMapping(Double.class, num -> "浮点数:" + num.doubleValue());
        mapper.addMapping(Long.class, num -> "长整数:" + num.longValue());
        mapper.addMapping(Byte.class, num -> "字节:" + num.byteValue());

        // 测试不同类型的对象
        Number num1 = 100;
        Number num2 = 3.14;
        Number num3 = 9999999999L;
        Number num4 = (byte) 8;

        System.out.println(mapper.apply(num1));
        System.out.println(mapper.apply(num2));
        System.out.println(mapper.apply(num3));
        System.out.println(mapper.apply(num4));
    }
}

输出结果:

代码语言:txt
复制
整数:100
浮点数:3.14
长整数:9999999999
字节:8

在这个例子中,我们使用InstanceOfMapper类来替代Java中的instanceOf关键字。我们通过addMapping方法添加了不同类型的Class对象和对应的处理函数,然后通过apply方法来判断对象的类型,并根据类型调用相应的处理函数进行处理。

请注意,该实现方式是基于Java 8的Lambda表达式和函数式接口实现的。如果你需要在Java 7或更低版本中使用,可能需要做一些相应的调整。此外,这只是一个简单的示例,你可以根据实际需求进行扩展和改进。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Java8函数式编程

不过事实上,lambda表达式并不是匿名语法糖,而且经过一段时间使用,感觉恰恰相反,使用上匿名更像是Javalambda表达式载体。...减少不必要方法创建 Java,我们经常会遇到这样一种场景,某个方法只会在某处使用且内部逻辑也很简单,Java8之前我们通常都会创建一个方法,但是事实上我们经常会发现这样写着写着,一个方法可能会变得非常庞杂...就是对Function封装。...这个概念可能比较难理解,那举个例子,我们需要将[“hello”, “world”]转换成[h,e,l,l,o,w,o,r,l,d],可以尝试一下使用map,那你会惊讶地发现,可能结果不是你想象那样。...此处以最典型map作为例子,可以看看map源码 public Optional map(Function<? super T, ?

63620

Java Lambda 解析和使用技巧

java ,我更加愿意认为 lambda 实际上是是包着一个函数对象,我们使用 lambda 表达式时候,实际上定义了一个闭包函数对象,这是 lambda 最大意义所在。...performed on an object | 输入 T,返回 void Function – a function transforming a T to a R | 输入 T 返回 R...而匿名内部类或者是内部类使用则要注意 this 指向问题。...extends V> function) 作用是对Map每个映射执行function指定操作,并用function执行结果替换原来value,其中BiFunction是一个函数接口,里面有一个待实现方法...不存在才加,存在直接跳过 Function是一个函数接口,里面有一个待实现方法R apply(T t). computeIfAbsent()常用来对Map某个key值建立初始化映射.比如我们要实现一个多值映射

1K10
  • MapJava 8增加非常实用哪些函数接口?

    方法签名为V putIfAbsent(K key, V value),作用是只有不存在key值映射映射值为null时,才将value指定放入Map,否则不对Map做更改.该方法将条件判断和赋值合二为一...Object value)方法,只有在当前Mapkey正好映射到value时才删除该映射,否则什么也不做. replace() Java7及以前,要想替换Map映射关系可通过put(K key,...extends V> function),作用是对Map每个映射执行function指定操作,并用function执行结果替换原来value,其中BiFunction是一个函数接口,里面有一个待实现方法...R apply(T t, U u).不要被如此多函数接口吓到,因为使用时候根本不需要知道他们名字....Function是一个函数接口,里面有一个待实现方法R apply(T t). computeIfAbsent()常用来对Map某个key值建立初始化映射.比如我们要实现一个多值映射Map定义可能是

    2K50

    Lambda表达式你会用吗?

    Lambda 允许把函数作为一个方法参数(函数作为参数传递进方法)。 使用 Lambda 表达式可以使代码变更加简洁紧凑。...首先回顾一下Java集合框架接口继承结构: ? 上图中绿色标注接口,表示Java8加入了新接口方法,当然由于继承关系,他们相应子类也都会继承这些新方法。下表详细列举了这些方法。...方法签名为V putIfAbsent(K key, V value),作用是只有不存在key值映射映射值为null时,才将value指定放入Map,否则不对Map做更改.该方法将条件判断和赋值合二为一...R apply(T t, U u).不要被如此多函数接口吓到,因为使用时候根本不需要知道他们名字....Function是一个函数接口,里面有一个待实现方法R apply(T t). computeIfAbsent()常用来对Map某个key值建立初始化映射.比如我们要实现一个多值映射Map定义可能是

    89930

    Java开发之Java8 新特性--流式数据处理学习

    流式处理简介 我接触到java8流式处理时候,我第一感觉是流式处理让集合操作变得简洁了许多,通常我们需要多行代码才能完成操作,借助于流式处理可以一行实现。...filter 在前面的例子我们已经演示了如何使用filter,其定义为:Stream filter(Predicate<?...2.2 映射 SQL,借助SELECT关键字后面添加需要字段名称,可以仅输出我们需要字段数据,而流式处理映射操作也是实现这一目的,java8流式处理,主要包含两映射操作:map和flatMap...map 举例说明,假设我们希望筛选出所有专业为计算机科学学生姓名,那么我们可以filter筛选基础之上,通过map将学生实体映射成为学生姓名字符串,具体实现如下: List names...与map类似,flatMap也提供了针对特定类型映射操作:flatMapToDouble(Function<? super T,?

    1.8K20

    java8实战:使用流收集数据之toList、joining、groupBy(多字段分组)

    实战读书笔记:数值流、Stream创建与Optional使用 java8读书笔记:探究java8流收集数据原理 本文将从Collectos构建收集器入手,详细介绍java8提供了哪些收集器,重点介绍...方法实现原理已经 java8读书笔记:探究java8流收集数据原理也详细介绍,故本篇不再重点介绍。...代码@2:构建最终累积器。其实现要点如下: 对流元素,使用Function classifier,获取对应分类键值。...使用mangledFactory创建累积初始值,并调用Map#computeIfAbsent方法,放入值为:downstreamSupplier.get()。...,主要Map存储结构为HashMap,java8为ConcurrentMap对应继承体系提供了对应分组函数:groupingByConcurrent,其使用方法与groupingBy方法类型,故不重复介绍

    9.3K41

    用好强大Stream

    函数式接口 众所周知,Java8提供了很多新特性,Lambda表达式,函数式接口,Optional,新日期api。今天简单聊一下Stream前世今生。... function) { return function.apply(str); } 当然,为了方便我们使用,还有很多其他内置接口,看入参和返回值就能知道接口作用...int applyAsInt(T value) IntFunction R apply(int value) Stream介绍 Java8之前,如果我们想对集合进行操作还是比较麻烦。...很多方法入参其实就是一个函数式接口 映射 函数名 解释 map 接收一个函数作为参数,该函数被应用到每个元素上,并将其映射成一个新元素 flatMap 接受一个函数作为参数,将流每一个值都转换成另一个流...,然后将所有流连接成一个流 先看这2个方法定义 Stream map(Function<?

    54410

    Java8 通关攻略

    这样接口这么简单,都不值得程序定义,所以,JDK8 java.util.function 定义了几个标准函数式接口,供我们使用。...无 T 返回类型为T对象,包 含方法:T get(); Function T R 对类型为T对象应用操作,并返回结果。...方法 描述 map(Function f) 接收一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新元素 mapToDouble(ToDoubleFunction f) 接收一个函数作为参数...所有使用该接口实体为了适配新接口约定都需要进行修改(要是这么不兼容的话,迟早被淘汰)。所以,Java8为了解决这一问题引入了一种新机制。Java8接口支持声明方法同时提供实现。...我们应该尽量使用这个新方法,而不是老size方法,size方法返回类型为int。这是因为映射数量可能是int无法表示

    1.2K31

    Java8 Lambda(一)-函数式接口

    实习前只是粗略看了下Java8一些基本语法,但是没有系统学习过.使用一段时间后决定系统对其进行一次分析,加深对Java8函数式编程理解,提高自己编码技巧.另外kotlin崛起,感兴趣朋友尝试下混编也未尝不可...,如果有两个则无法推断.Java8提供了很多函数式接口,一般都使用注解@FunctionalInterface声明,有必要了解如下一些函数式接口....extends R> mapper); map操作接收Function接口,对于Function接收T值返回R值,那map作用就很明显是转换用,比如下面代码,转换名称为对应名称长度,也就是从输入...extends R>> mapper); flatMap和map都是使用Function接口,不同是返回值flatMap限定为Stream类型.所以flatMap可以作为合并流使用,如以下代码,提取出所有的字符...super T> action); peek参数为Consumer,Consumer接收T值,无返回,那么该方法就可以作为调试不影响stream内容一些操作,不过由于对象都是地址引用,你再此做一些对象内容操作也是可以

    1.6K30

    浅谈lambda表达式

    Java8其中一个很重要新特性就是lambda表达式,允许我们将行为传到函数。想想看,Java8 之前我们想要将行为传入函数,仅有的选择就是匿名内部类。...Java8发布以后,lambda表达式将大量替代匿名内部类使用,简化代码同时,更突出了原来匿名内部类中最重要那部分包含真正逻辑代码。...尤其是对于做数据同学来说,当习惯使用类似scala之类函数式编程语言以后,体会将更加深刻。现在我们就来看看Java8lambda表达式一些常见写法。...我们例子,就是通过map方法将cost增加了0,05倍大小然后输出。...相信用map+reduce+lambda表达式写法高出不止一个level。 4、filter操作 filter也是我们经常使用一个操作。操作集合时候,经常需要从原始集合过滤掉一部分元素。

    49110

    通俗易懂讲解 lambda 表达式

    Java8其中一个很重要新特性就是lambda表达式,允许我们将行为传到函数。想想看,Java8 之前我们想要将行为传入函数,仅有的选择就是匿名内部类。...Java8发布以后,lambda表达式将大量替代匿名内部类使用,简化代码同时,更突出了原来匿名内部类中最重要那部分包含真正逻辑代码。...我们例子,就是通过map方法将cost增加了0,05倍大小然后输出。...相信用map+reduce+lambda表达式写法高出不止一个level。 4、filter操作 filter也是我们经常使用一个操作。操作集合时候,经常需要从原始集合过滤掉一部分元素。...5、与函数式接口Predicate配合 除了语言层面支持函数式编程风格,Java 8也添加了一个包,叫做 java.util.function。它包含了很多,用来支持Java函数式编程。

    54820

    深度探秘 Java 8 函数式编程(上)

    来源:http://t.cn/ELmra8O 引子 将行为作为数据传递 Java8函数框架解读 函数接口 聚合器 流 ---- 引子 将行为作为数据传递 怎样一行代码里同时计算一个列表和、最大值、...Java8函数框架解读 函数编程最直接表现,莫过于将函数作为数据自由传递,结合泛型推导能力,使代码表达能力获得飞一般提升。那么,Java8是怎么支持函数编程呢?...mergeFunction用来对两个map相同key值进行运算得到新value值,如果value值为null,会移除相应key,否则使用value值作为对应key值。...元素流) ,定义 StreamShape ,主要将操作适配于类型系统。...Spliterator具体实现定义 Spliterators 静态和静态方法

    76420

    关于 Java Lambda 表达式看这一篇就够了(强烈建议收藏)

    方法签名为V putIfAbsent(K key, V value),作用是只有不存在key值映射映射值为null时,才将value指定放入Map,否则不对Map做更改.该方法将条件判断和赋值合二为一...,使用起来更加方便. remove() 我们都知道Map中有一个remove(Object key)方法,来根据指定key值删除Map映射关系;Java8新增了remove(Object key,...Object value)方法,只有在当前Map**key正好映射到value时**才删除该映射,否则什么也不做. replace() Java7及以前,要想替换Map映射关系可通过put(K...Function是一个函数接口,里面有一个待实现方法R apply(T t). computeIfAbsent()常用来对Map某个key值建立初始化映射.比如我们要实现一个多值映射Map定义可能是...map() 函数原型为 Stream map(Function<? super T,?

    2.6K32

    Java8新特性理解与应用

    String getValue(String str); b.声明一个TestLambda_3,编写成员方法test_2,使用a定义接口作为该方法参数,将一个字符串"lambda"转换为大写...,其中泛型类型为且T为参数,R为返回值,同时该接口中声明对应抽象方法;b.TestLambda_3声明一个成员方法calculate()并使用a接口作为参数,输出员工信息。...并且可以使用@FunctionnalInterface注解修饰,以此来判断该接口是否是函数式接口。Java8以后,函数式接口中允许存在普通方法(即非抽象方法),使用default进行修饰。...2.2内置4大核心函数式接口Cosumer消费型接口;//抽象方法 void accept(T t);Supploer 供给型接口;//抽象方法 T get();Function 函数型接口...3.1基本概念Stream API是java8处理集合关键抽象概念,它可以对指定集合进行操作,如执行非常复杂查找、过滤和映射数据等操作;使用Stream API对集合数据进行操作,类似于使用SQL

    82430

    探究Java8Stream(二)

    “ 在上一篇文章,我们聊到Stream创建四种方式,以及中间操作筛选与切片,那么今天我们来看一下映射和排序” 01 — 映射探究Java8Stream(一)我们说到了映射API,稍微再提一下...: 1.map(Function f) 接收一个函数作为参数,该函数会被应用到每个元 素上,并将其映射成一个新元素 2.mapToDouble(ToDoubleFunction f) 接收一个函数作为参数...将流id通过map弄到一个新,然后输出流出来,这里从map方法我们可以看出来,它接受一个函数作为参数,然后对其中每个元素进行映射,进而返回了一个新流,这个流就叫做映射流(R指定新流元素类型...,T指定调用流元素类型,mapper是完成映射Function实例,被称为映射函数)。... Stream map(Function<? super T, ?

    55220

    面试 | Java8 HashMap原理

    概述 官方文档是这样描述HashMap: Hash table based implementation of the Map interface....构造函数 HashMap构造函数并没有对数组Node[] table初始化,而是简单设置参数,首次put时调用resize()分配内存 //制定初始容量和填充因子 public...通过tableSizeFor(),保证了HashMap容量始终是2次方,通过hash寻找index时就可以用逻辑运算来替代取余,即hash%n用hash&(n -1)替代 4. hash实现 static...大意是,如果直接使用keyhashcode()作为hash很容易发生碰撞。比如,n - 1为15(0x1111)时,散列值真正生效只是低4位。...中保存初始容量分配内存,没有就使用缺省值 + 当超过限制时,就扩充两倍,因为我们使用是2次幂扩展,所以,元素位置要么是原位置,要么是原位置再移动2次幂位置 如oldCap为16时,如图

    59730

    马上Java14要来了,你还不知道Java8新特性?

    ,它是Java8这个版本最重要新特性.Lambda允许把函数作为一个方法参数, 可以使代码变得更加简洁....Function类型接口 @FunctionalInterface public interface Function { // 接收一个参数T,返回一个结果R R apply...所以不接受任何参数,返回T类型结果。 3、方法引用 方法引用使得开发者可以将已经存在方法作为变量来传递使用。方法引用可以和Lambda表达式配合使用。...:需要进行转换集合 Function:函数接口,接收T类型,返回R类型。...System.out::println 其实是 指定对象System.out非静态方法println引用 如果构造函数有多个,可能无法区分导致传递失败 4、接口默认方法和静态方法 Java8使用两个新概念扩展了接口含义

    70020
    领券