前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >scala(十二) 特质

scala(十二) 特质

作者头像
用户1483438
发布于 2022-04-18 07:09:24
发布于 2022-04-18 07:09:24
55500
代码可运行
举报
文章被收录于专栏:大数据共享大数据共享
运行总次数:0
代码可运行

特质的定义

Scala语言中,采用特质(trait)来代替接口的概念,也就是说,多个类具有相同的特质(trait)时,就可以将这个特质(trait)独立出来,采用关键字trait声明。

Scala中的trait中即可以有抽象属性和方法,也可以有具体的属性和方法,一个类可以混入(mixin)多个特质

Scala引入trait特征,第一可以替代Java的接口,第二个也是对单继承机制的一种补充。

特质的语法

trait 特质名 { trait体 }

案例一:人类有很多不同的特性,有的人会唱歌,有的人会跳舞,也有即会唱歌又会跳舞。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  // 跳舞
  trait Dancing{
    //具体的舞蹈有子类去实现
    def dance():Unit
  }

  // 唱歌
  trait Sing{
    //具体的歌曲有子类去实现
    def song():Unit
  }

若是把你我他分类的话,那我们都属于人类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  // 人类
  abstract class Person{

    val name:String

  }

创建学生类;每个学生都会一些基本舞蹈和歌曲,就需要使用 with 去实现 DancingSing两个 特质(trait)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  //学生
  class Student(val na:String) extends Person with Dancing with Sing {
    //重写 姓名属性
    override val name:String=this.na

    override def dance(): Unit = {
      println(s"$name 在跳,广播体操")
    }

    override def song(): Unit = {
      println(s"$name 在唱,保卫黄河")
    }
  
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  def main(args: Array[String]): Unit = {
    val student=new Student("马小跳")
    student.dance() // 马小跳 在跳,广播体操
    student.song() // 马小跳 在唱,保卫黄河
  }

子类需要继承父类的时候,此时extends 关键字用于继承class,特质的实现通过with关键字实现。

案例二:程序员工作离不开电脑,一台电脑组成又分为很多模块。 主板:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  trait Motherboard{
    def boardInfo():Unit 
  }

CPU:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  trait CPU{
    def cpuInfo():Unit
  }

内存:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  trait RAM{
    def ramInfo():Unit
  }

额太多了,就不写了,

定义好电脑的模板

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  class Computer(val board:String,val cpu:String,val ram:String) extends Motherboard with CPU with RAM{
    override def boardInfo(): Unit = {
      println(s"主板:$board")
    }

    override def cpuInfo(): Unit = println(s"CPU:$cpu")

    override def ramInfo(): Unit = println(s"内存:$ram")
  }

根据我们的配置,组装电脑

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  def main(args: Array[String]): Unit = {

    val   computer=new Computer("超级好的主板","超级好的CPU","超级大的内存")
    
    computer.boardInfo()
    computer.cpuInfo()
    computer.ramInfo()
   
  }
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
主板:超级好的主板
CPU:超级好的CPU
内存:超级大的内存

子类不需要继承父class 的时候 ,此时 第一个特质的实现通过 extends 关键字来实现,其他特质依旧使用 with关键字。

通过上面两种案例讲解说明,特质(trait) 的两种实现方式

  1. 子类需要继承父类的时候,此时extends 关键字用于继承class,特质的实现通过with关键字实现。
  2. 子类不需要继承父class 的时候 ,此时 第一个特质的实现通过 extends 关键字来实现,其他特质依旧使用 with关键字。

在特质(trait)中 既可以定义抽象方法,也可以定义具体方法。 如:拿案例二演示(不管合不合理,意思明白就行)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  trait Motherboard{

    def boardInfo():Unit

    //内存插口
    def ramInterface(): Unit ={
      println("只有两个内存插口")
    }

  }

具体方法,子类可不用重写,直接调用即可。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  def main(args: Array[String]): Unit = {
    val computer=new Computer("超级好的主板","超级好的CPU","超级大的内存")
    computer.ramInterface()
  }

在特质(trait)中 既可以定义抽象属性,也可以定义具体属性。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  // 主板
  trait Motherboard{
    // 抽象属性
    val info:String
    // 具体属性
    val area=18
    

    def boardInfo():Unit

    //内存插口
    def ramInterface(): Unit ={
      println("只有两个内存插口")
    }

  }

抽象属性需要被子类重写

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  class Computer(val board:String,val cpu:String,val ram:String) extends Motherboard with CPU with RAM{
    override def boardInfo(): Unit = println(s"主板:$board")
    override def cpuInfo(): Unit = println(s"CPU:$cpu")
    override def ramInfo(): Unit = println(s"内存:$ram")

    // 重写 Motherboard 中的 info 属性
    override val info: String = "主板"
  }

基本语法:

  1. 没有父类:class 类名 extends 特质1 with 特质2 with 特质3 …
  2. 有父类:class 类名 extends 父类 with 特质1 with 特质2 with 特质3…

说明

  1. 类和特质的关系:使用继承的关系。
  2. 当一个类去继承特质时,第一个连接词是extends,后面是with。
  3. 如果一个类在继承特质和父类时,应当把父类写在extends后。

对象的混入

这里用上面的案例一 演示说明; 现在的学生,若只会 唱歌跳舞 肯定是不行的,有点家庭比较好的学生肯定还有其他的,。比如:弹钢琴,弹吉他

乐器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  trait MusicalInstruments{
    def play:Unit
  }

由于该特质(trait)属于个别同学所独有的,所以就无需定义到 Student 中。而是让 使用with关键字,让个别对象去实现。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  def main(args: Array[String]): Unit = {
    val weh=new Student("王二虎") with  MusicalInstruments {
      override def play(): Unit = {println(s"$name 弹棉花")}
    }
    weh.dance()
    weh.song()
    weh.play()

    val lff=new Student("李菲菲") with  MusicalInstruments {
      override def play(): Unit = {println(s"$name 弹棉花")}
    }

    lff.dance()
    lff.song()
    lff.play()

    val mxt=new Student("马小跳")

    mxt.dance()
    mxt.song()

  }

输出结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
王二虎 在跳,广播体操
王二虎 在唱,保卫黄河
王二虎 弹棉花
李菲菲 在跳,广播体操
李菲菲 在唱,保卫黄河
李菲菲 弹棉花
马小跳 在跳,广播体操
马小跳 在唱,保卫黄河

这种行为就叫对象混入 (2)一个类可以混入(mixin)多个特质 (3)所有的Java接口都可以当做Scala特质使用 (4)动态混入:可灵活的扩展类的功能

方法叠加

由于一个类可以混入(mixin)多个trait,且trait中可以有具体的属性和方法,若混入的特质中具有相同的方法(方法名,参数列表,返回值均相同),必然会出现继承冲突问题。冲突分为以下两种:

第一种,一个类(Sub)混入的两个trait(TraitA,TraitB)中具有相同的具体方法,且两个trait之间没有任何关系,解决这类冲突问题,直接在类(Sub)中重写冲突方法。

第二种,一个类(Sub)混入的两个trait(TraitA,TraitB)中具有相同的具体方法,且两个trait继承自相同的trait(TraitC),及所谓的“钻石问题”,解决这类冲突问题,Scala采用了特质叠加的策略。

所谓的特质叠加,就是将混入的多个trait中的冲突方法叠加起来;

定义五个特质(trait)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  trait A{
    def sayHello()={
      println("hello","A")
    }
  }

  trait B{

    def sayHello()={
      println("hello","B")
    }
  }

  trait C{

    def sayHello()={
      println("hello","C")
    }
  }

  trait D{

    def sayHello()={
      println("hello","D")
    }
 }

定义 一个 H 类 去实现这些特质(trait)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class H extends A with B with C with D{}

通过 H 调用 sayHello()

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  def main(args: Array[String]): Unit = {
    val h =new H
    h.sayHello()

  }

结果报错了;意思是说,这些函数有歧义,不指定该调用谁的 sayHello 函数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Error:(34, 9) class H inherits conflicting members:
  method sayHello in trait C of type ()Unit  and
  method sayHello in trait D of type ()Unit
(Note: this can be resolved by declaring an override in class H.)
  class H extends A with B with C with D{}

也提示你this can be resolved by declaring an override in class H. ;让你重写 sayHello()

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  class H extends A with B with C with D{

    override def sayHello(): Unit =  println("hello","H")
  }

这样运行就没有问题了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(hello,H)

还有一种情况,子类中可以通过super 访问父类的方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  class H extends A with B with C with D{
    super.sayHello()
    override def sayHello(): Unit =  println("hello","H")
  }

结果:super.sayHello()打印的是 D 的 sayHello()。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(hello,D)
(hello,H)

这种结果产生的原因很简单,因为的继承顺序是从 A-D,所以从左到右的顺序去找最后一个重名的函数,所以运行的是特质D的sayHello()。

若要调用指定的特质的sayHello(),可以使用[]指定。 如调用 特质B 的sayHello()。 语法:

super[特质名].方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 class H extends A with B with C with D{
    super[B].sayHello()
    override def sayHello(): Unit =  println("hello","H")
  }
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(hello,B)
(hello,H)

以上就是第一种冲突方式,及解决方式。

说完第一种,还有第二种,指多个特质(trait)是有联系的。 再定义一个特质(trait) F 并定义一个 sayHello()

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  trait F{
    def sayHello()={
      println("hello","F")
    }
  }

其他特质A-D 继承 F 重写 sayHello(),并各自调用父类(F) 的sayHello()。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  trait A extends F {

    override def sayHello()={
      println("hello","A")
      super.sayHello()
    }
  }

  trait B extends F{

    override def sayHello()={
      println("hello","B")
      super.sayHello()
    }
  }

  trait C extends F{

    override def sayHello()={
      println("hello","C")
      super.sayHello()
    }
  }

  trait D extends F{

    override def sayHello()={
      println("hello","D")
      super.sayHello()
    }
  }

H 不变

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  class H extends A with B with C with D{
    super.sayHello()
    override def sayHello(): Unit =  println("hello","H")
  }

此时的运行结果如何?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  def main(args: Array[String]): Unit = {
    val h =new H
    h.sayHello()
  }

结果:这种就是所谓的“钻石问题”

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(hello,D)
(hello,C)
(hello,B)
(hello,A)
(hello,F)
(hello,H)

原理也很简单。 首先运行的是H,H调用spuer 会运行特质D,然后由D调用 super ,此时D并不是调用 F,而是指向的是上一个特质C ,然后C又指向B,B又指向A,此时A才真正的指向F。由于A-D super 是在打印下面所有先这执行的打印后执行的super。H和其他相反,super在前,打印在后。运行最后运行的是H。

钻石的形式
钻石的形式

红色:表示继承或实现 黑色:表示指向

自身类型

有这么一个需求,需要将对象持久化(保存到磁盘) 回顾 java 实现对象持久化步骤

  1. 实现 Serializable 接口
  2. 提供get/set 方法
  3. 序列化,使用ObjectOutputStream 对对象写入文件
  4. 反序列化,读取文件生成对象,使用ObjectInputStream

scala 中也是也是如此 创建一个Person类,提供get/set 方法,暂时不指定 Serializable 接口。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  class Person {
    // id
    @BeanProperty var id:Int=_
    // 姓名
    @BeanProperty var name:String=_
    // 年龄
    @BeanProperty var age:Int=_
  }

序列化、反序列化是一个完整的功能,我们可以将其封装到单独的类中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  class ObjectWriteAndRead{
    /**
     * 序列化
     * @param path 文件地址
     */
    def write(path:String): Unit ={
      try {
        val fos=new FileOutputStream(path)
        val objectInput=new ObjectOutputStream(fos)
        // 写入磁盘
       objectStream.writeObject(this)

        // 刷新与关闭
        objectStream.flush()
        objectStream.close()
        fos.close()
        println("序列化成功")
      }catch {
        case e:IOException=>{
          println("序列化失败",e)
        }
      }
    }
  }

Person 若要进行序列化或反序列化可以继承该类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 class Person  extends ObjectWriteAndRead{...}

若对象没有实现序列化接口,运行时肯定会报错

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 def main(args: Array[String]): Unit = {
    //创建对象
    val person=new Person()
    person.setId(1001)
    person.setName("王小二")
    person.setAge(19)

    person.write("D:\\aaa.txt")
  }

报错

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(序列化失败,java.io.NotSerializableException: com.admin.xxx.traita.Demo03$Person)

别觉得我说的是废话,遇到这种情况,我们很多时候都会忘记(是否实现了Serializable接口),只有等到运行报错时,翻看异常信息才恍然大悟。有没有一种机制能让我们在一开始就提示我们,而不是等到出问题之后?

这就需要自身类型了,它主要用于提醒子类,子类继承父类,需要满足继承父类的某些条件。如:必须实现 Serializable接口

语法:

this:类型 =>

案例:指定 ObjectWriteAndRead 的自身类型

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  class ObjectWriteAndRead{
    this: Serializable =>
    ...
  }

此时 Person 类就弹错误,告知其需要实现 Serializable 接口。

自身类型
自身类型

按照提示实现 Serializable 接口。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Person  extends ObjectWriteAndRead with Serializable {...}

然后再运行

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
序列化成功

这就是自身类型的作用,说重要也不重要,但是是一个很好的辅助,大大提高我们开发效率,毕竟减少了解决报错的时间。

最后也把反序列化完成吧,在ObjectWriteAndRead新增一个read函数,用于进行反序列化

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 class ObjectWriteAndRead{
    this: Serializable =>
    /**
     * 序列化
     * @param path 文件地址
     */
    def write(path:String): Unit ={
      try {
        val fos=new FileOutputStream(path)
        val objectStream=new ObjectOutputStream(fos)
        // 写入磁盘
        objectStream.writeObject(this)

        // 刷新与关闭
        objectStream.flush()
        objectStream.close()
        fos.close()
        println("序列化成功")
      }catch {
        case e:IOException=>{
          println("序列化失败",e)
        }
      }
    }

    /**
     * 反序列化
     * @param path
     * @return
     */
    def read(path:String):AnyRef={

     try {
       val fis=new FileInputStream(path)

       val objectStream=new ObjectInputStream(fis)
       println("反序列化成功")
       objectStream.readObject()
     }catch {
       case e:IOException =>{
         println("反序列化失败",e)
         null
       }
     }
    }
  }

运行

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  def main(args: Array[String]): Unit = {
    //创建对象
    val person=new Person()
    person.setId(1001)
    person.setName("王小二")
    person.setAge(19)
    // 序列化
    person.write("D:\\aaa.txt")

    //反序列化
    val newPerson = person.read("D:\\aaa.txt").asInstanceOf[Person]
    println(person.getId)
    println(person.getName)
    println(person.getAge)
  }

person.read("D:\aaa.txt") : 是一个反序列化的结果,类型是AnyRef .asInstanceOf[T] 用于类型强转

输出结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
序列化成功
反序列化成功
1001
王小二
19

完整代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Person  extends ObjectWriteAndRead with Serializable {
    // id
    @BeanProperty var id:Int=_
    // 姓名
    @BeanProperty var name:String=_
    // 年龄
    @BeanProperty var age:Int=_

  }

  def main(args: Array[String]): Unit = {
    //创建对象
    val person=new Person()
    person.setId(1001)
    person.setName("王小二")
    person.setAge(19)
    // 序列化
    person.write("D:\\aaa.txt")



    //反序列化
    val newPerson = person.read("D:\\aaa.txt").asInstanceOf[Person]
    println(person.getId)
    println(person.getName)
    println(person.getAge)

  }


  class ObjectWriteAndRead{
    this: Serializable =>
    /**
     * 序列化
     * @param path 文件地址
     */
    def write(path:String): Unit ={
      try {
        val fos=new FileOutputStream(path)
        val objectStream=new ObjectOutputStream(fos)
        // 写入磁盘
        objectStream.writeObject(this)

        // 刷新与关闭
        objectStream.flush()
        objectStream.close()
        fos.close()
        println("序列化成功")
      }catch {
        case e:IOException=>{
          println("序列化失败",e)
        }
      }
    }

    /**
     * 反序列化
     * @param path
     * @return
     */
    def read(path:String):AnyRef={

     try {
       val fis=new FileInputStream(path)

       val objectStream=new ObjectInputStream(fis)
       println("反序列化成功")
       objectStream.readObject()
     }catch {
       case e:IOException =>{
         println("反序列化失败",e)
         null
       }
     }
    }
  }

扩展

类型检查和转换

定义三个类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  class Person{
    val name="Person"
  }

  class Student extends Person{
    override val name: String = "Student"
  }

  class Teacher extends Person{
    override val name: String = "Teacher"
  }

Student 与 Teacher 都继承 Person

  1. obj.isInstanceOf[T]:判断obj是不是T类型。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  def main(args: Array[String]): Unit = {
    val stu:Person=new Student

    println(s"判断是否为 Student 类:${stu.isInstanceOf[Student]}")
    println(s"判断是否为 Teacher 类:${stu.isInstanceOf[Teacher]}")
  }
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
判断是否为 Student 类:true
判断是否为 Teacher 类:false
  1. obj.asInstanceOf[T]:将obj强转成T类型。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  def main(args: Array[String]): Unit = {
    val stu:Person=new Student

    val o1=stu.asInstanceOf[Person]
    println("o1:"+o1.name)

    val o2=stu.asInstanceOf[Student]
    println("o2:"+o2.name)

    val o3=stu.asInstanceOf[Teacher]
    println("o3:"+o3.name)

  }

o3 无法转换 无法转换为 Teacher

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
o1:Student
o2:Student
Exception in thread "main" java.lang.ClassCastException: com.admin.xxx.traita.Demo04$Student cannot be cast to com.admin.xxx.traita.Demo04$Teacher

至于为啥o1 输出的也是 Student 因为Scala 中属性也具有多态性。

  1. classOf获取对象的类名。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  def main(args: Array[String]): Unit = {

    val clazz: Class[Student] = classOf[Student]
    println(clazz.getSimpleName) // 获取类名
  }
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Student

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
人工智能审核视音频有什么好处?智能审核有哪些好的技巧?
众所周知,现在国内主流的音频视频传播平台非常多,每个平台都有非常多的用户,每天都会上传无数的音频内容和视频内容,而国家目前对于用户自动上传的内容有非常严格的审核要求,这也导致许多主流网站的审核压力特别大,因为网站一旦涉及传播一些违法内容,不仅会对用户造成影响,还有可能给网站带来损失。人工审核费时费力,而且无法应对海量的内容,所以现在很多网站使用人工智能审核视音频。人工智能审核视音频有什么好处呢?
用户8715145
2021/12/30
2.2K0
抖音推荐算法总结[通俗易懂]
抖音推荐算法究竟如何是做抖音短视频运营的同学非常关心的问题,抖音官方并没有披露正式的算法,但凭借着民间的智慧和官方披露的部分信息中,网友已经总结出抖音推荐算法的秘密。这里整理资料如下:
全栈程序员站长
2022/07/26
9.9K0
抖音推荐算法总结[通俗易懂]
人工智能时代,如何做好内容审核和流量反作弊?
人工智能时代,如何做好内容审核和流量反作弊?
数据猿
2018/05/31
3.1K0
抖音是如何做内容推荐的?
抖音推荐算法究竟是如何推荐和运作的?是做抖音短视频运营的同学非常关心的问题,抖音官方并没有披露正式的算法,这里根据实际运营观察和官方披露的部分信息,总结出抖音推荐算法的秘密。相关资料整理如下:
肉眼品世界
2022/06/15
1.3K0
抖音是如何做内容推荐的?
坚守音视频领域多年:是偶然,也是必然
LiveVideoStack:华平你好,我们是在2017年认识的,当时你还在“WiFi万能钥匙”,说说你的近况吧。
LiveVideoStack
2020/05/26
1.1K0
人工智能审核短视频的什么方面 智能审核会出错吗
随着人们生活水平变得越来越好,很多娱乐项目都逐渐走进人们的日常生活中,尤其是现在最火爆的视频,这也导致很多视频平台现世。这些视频平台都有自己的一套审核机制,会对视频创作者发布的视频进行一系列的审核,审核通过才会展现给各位看。那么人工智能审核短视频的什么方面?
用户8715145
2021/12/30
2.4K0
【程序源代码】抖音视频去水印工具
“ 关键字:  “抖音视频批量去水印下载 工具 源码"  01 ———— 【总体介绍】 作为一名计算机电脑办公人员和使用者。我们在实现工作中或者日常学习中经常会遇到这个办公场景。经常需要 "抖音视频批量去水印下载",也就是说将抖音视频批量下载中的文字、图片、报表等水印只读的内容转换成屏蔽状态编辑的状态,即将只读转换成可编辑的格式。这个办公场景想想大家都在实际工作和学习中都遇到过。 原来我们做的方式有好多种:1、在网络购买可相关软件,付费花钱卖转换工作 2、或者在网上充各类的会员或者VIP,有的会员按照
程序源代码
2022/09/02
1.6K0
【程序源代码】抖音视频去水印工具
音视频技术开发周刊 | 283
每周一期,纵览音视频技术领域的干货。 新闻投稿:contribute@livevideostack.com。 基于隐扩散模型的高分辨率图像合成 本文提出的隐扩散模型(LDM)在图像修补和类条件图像合成方面具有一定优势,并且在各种任务(包括文本到图像合成、无条件图像生成和超分辨率)上具有高度竞争性的性能,此外与基于像素的扩散模型相比显着降低了计算需求。 ChatGPT之父Sam Altman最新文章:AGI及未来计划 AGI也会带来严重的滥用、严重事故和社会混乱的风险。因此,OpenAI希望可以通过制定一
LiveVideoStack
2023/04/04
8080
音视频技术开发周刊 | 283
【一周要闻】抖音独立电商App“抖音盒子”正式运行;百度上线青春版搜索App“Wonder”;B站发布商业中台系统“品牌银行”
【新热点】 B站发布商业中台系统“品牌银行” TikTok举行首个直播购物活动“On Trend” 中消协“点名”20款APP注销难:涉淘宝腾讯视频等 抖音独立电商App抖音盒子正式运行 【新奇特】 百度新增“Wonder”App:定位年轻群体泛信息服务平台 顺丰同城新增“埋单单”微信小程序试水社交拼单 新热点 12月10日 B站发布商业中台系统“品牌银行” (图片来源于网络) 据悉,B站近期在上海举办的ADTALK 2021营销大会上,副董事长兼COO李旎首次发布了B站商业中台系统“品牌银行”。品牌银
iCDO互联网数据官
2022/03/03
8040
计算机视觉及智能影像行业深度研究报告
计算机视觉是 AI 核心研究领域,目的在于让机器具备人类的“眼力”。计算机视觉是人工智能的 分支之一,目的在于通过电子化的方式来感知和理解影像,让计算机具备和人一样的"眼力",能够 识别、理解周围的世界。人脑接受的 80%的信息来自眼睛(视觉),50%的大脑活动都与处理视觉 信息有关,可见视觉在信息传递中的重要性和复杂性。
小白学视觉
2022/12/27
7820
计算机视觉及智能影像行业深度研究报告
音视频技术开发周刊 | 279
每周一期,纵览音视频技术领域的干货。 新闻投稿:contribute@livevideostack.com。 ---- 基于NeRF的APP上架苹果商店!照片转3D只需一部手机 这个名叫Luma AI的“NeRF APP”,正式上架App Store后爆火。 反 AiArt 运动中两件匪夷所思的蠢事 Reddit 论坛上,拥有两千多万加入者的 ART 版块 reddit.com/r/Art,永久封禁了一名数字艺术家。理由是他违反版规,在该版上发布了一幅疑似 “AI 生成”的作品。这名被封禁的越南插画师 B
LiveVideoStack
2023/02/23
6080
音视频技术开发周刊 | 279
人工智能对视频审核的影响 人工智能的发展前景
现在很多平台都添加了一个人工智能的审核功能,也就是大家在平台发布的内容,首先得通过人工智能的审核机制,否则就无法发布。于是很多人都想尽办法解开平台的审核机制,这样就能避免审核失败,也能快速通过审核。下面跟各位讲讲人工智能对视频审核的影响有什么。
用户8715145
2022/03/18
1.2K0
常青:小程序音视频功能的原理及应用
12月15日,由腾讯云主办的首届“腾讯云+社区开发者大会”在北京举行。本届大会以“新趋势•新技术•新应用”为主题,汇聚了超40位技术专家,共同探索人工智能、大数据、物联网、小程序、运维开发等热门技术的最新发展成果,吸引超过1000名开发者的参与。以下是小程序分会场的演讲内容,稍作整理,分享给大家。
腾讯云开发者社区技术沙龙
2018/12/27
14.9K0
常青:小程序音视频功能的原理及应用
图解抖音推荐算法
在抖音,每天有数量庞大的新作品上传,纯靠机器审核容易被钻空子,纯靠人工审核又不太现实。因此,双重审核成为抖音算法筛选视频内容的第一道门槛。
week
2019/12/20
1.5K0
图解抖音推荐算法
音视频技术开发周刊 | 256
每周一期,纵览音视频技术领域的干货。 新闻投稿:contribute@livevideostack.com。 ---- LiveVideoStackCon 2022 上海站 | 8月5日我们一起聚焦音视频、探秘技术新发展 技术的快速升级正在一步步改变着人们的生活,创造出更多丰富的应用,带来更加前所未有的体验。元宇宙、虚拟人、数字孪生等更多新概念的涌现,催生出哪些新的音视频应用场景和体验,2022年8月5日-8月6日我们在上海海神诺富特大酒店一起探讨吧。 ⏰ 时间:2022年8月5-6日 📌 地点:上海·海
LiveVideoStack
2022/08/26
4840
音视频技术开发周刊 | 256
教你恢复App Store下架的菠菜及金融App产品
导读:最近很多人在我创建的交流群里十个有八个都在问我同一个问题“ios App被自己从应用商店下架后可以再恢復上架吗”“产品被App Store下架后,如何快速上线”大多都是App涉嫌违规,马甲包类型,app侵权等等
jiang chen
2018/08/10
1.9K0
教你恢复App Store下架的菠菜及金融App产品
假装AI,有多少人工智能是靠“人工”的“智能”?
建立一个真正由AI驱动的服务并不简单。所以,一些初创公司动起了歪脑筋——他们让人类模仿机器,而不是让机器学习人类,因为这样成本便宜得多,也容易得多。
科技云报道
2022/04/15
6930
假装AI,有多少人工智能是靠“人工”的“智能”?
音视频技术开发周刊 | 258
每周一期,纵览音视频技术领域的干货。 新闻投稿:contribute@livevideostack.com。 ---- LiveVideoStackCon 2022 北京站讲师招募开始啦! 11月4-5日,LiveVideoStackCon 2022 北京站将与大家继续探索音视频技术在不同场景下的融合与发展,在这里不仅可以与业内大佬们进行技术上的心得交流,还可以感受到多媒体生态内的头部公司、顶级玩家对行业当前发展趋势、瓶颈挑战,与对未来规划的深入解读。LiveVideoStackCon是每个人的舞台,如
LiveVideoStack
2022/08/26
4890
音视频技术开发周刊 | 258
抖音VS快手:两个世界的交战
毫无疑问,抖音和快手是短视频行业的双寡头——前者自称DAU已经突破3亿,后者则计划在2020年春节达到3亿DAU。它们在短视频领域各自拥有不可撼动的基本牌,2018-19年都成功地进军了直播,又都在尝试电商带货乃至自有电商平台。这两个平台在"战略上有高度类似之处,但是用户画像和调性仍然有很大区别——从Slogan就看得出来,抖音是“发现更美好的生活”,快手是“看见每一种生活”。
iCDO互联网数据官
2020/02/19
1.5K0
抖音VS快手:两个世界的交战
2022年互联网直播行业研究报告
自2000年后,随着网络时代到来,普及的电视直播逐渐被互联网直播取代,成为“直播”的代名词。近年来,随着互联网的高速发展与网民规模的持续增加,网络直播产业不断发展,进入更多人的视野,逐渐成为一种新的互联网文化业态。2020年,中国直播行业的市场规模达到1826亿元,较2019年同比增长30.4%,这主要得益于疫情期间宅经济的影响,用户上网时间较多,观看直播的人也越来越多,许多人宅在家里通过网络购物,在电商带货直播的带动下,直播行业有了爆发式增长。
资产信息网
2022/03/25
1.2K0
2022年互联网直播行业研究报告
推荐阅读
相关推荐
人工智能审核视音频有什么好处?智能审核有哪些好的技巧?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档