Android中使用Streams的两种方法

最近的两个项目中都使用了Streams函数(暂且这么叫,这里不想说到函数式编程),一个使用了Java8,另外的是Kotlin,做一下简单的笔记。

使用Java8

1. 安装JDK 8 

2. 配置工程,使用Java 8编译工程,在app/build.gradle中添加:

android {
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

3. 使用Lambda。RetroLambda帮助我们把Lambda表达式转为Java 6可以运行的字节码,在build.gradle中配置RetroLambda:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'me.tatarka:gradle-retrolambda:3.2.3'
        classpath 'me.tatarka.retrolambda.projectlombok:lombok.ast:0.2.3.a2'
    }
    configurations.classpath.exclude group: 'com.android.tools.external.lombok'
}

4. 使用Streams,引入了一个开源库Lightweight-Stream-API。这个库可以在Java 6的环境运行,但是如果没有Lambda,代码中的匿名类和回调会显得十分臃肿和笨拙。下面是引入这个库的配置,在app/build.gradle中添加依赖:

dependencies {
    compile 'com.annimon:stream:1.0.3'
}

OK,齐活,show个Demo:

    String[] names = new String[] {
            "Amy", "Alex", "Bob", "Cindy", "Jeff", "Jack",
            "Sunny", "Sara", "Steven"
    };

    //筛选S开头的人名
    Stream.of(names)
            .filter(name -> name.startsWith("s"))
            .collect(Collectors.toList());

    //按首字母分组并排序
    List<Map.Entry<String, List<String>>> group = Stream.of(names)
            .groupBy(name -> String.valueOf(name.charAt(0)))
            .sortBy(Map.Entry::getKey)
            .collect(Collectors.toList());

Kotlin

Kotlin,JetBrains开发的一种语言,语法个人感觉和C#很相似,现在还是Beta版本,能不能火起来真不好说。不过好多的开源库已经有Kotlin的实现了。Android开发的配置也很简单,Android Studio安装一个Kotlin插件就好了。这是官网的指南:Getting started with Android and Kotlin。下面是我的项目的配置:

app/build.gradle

apply plugin: 'kotlin-android'

android {
    sourceSets {
        main.java.srcDirs += 'src/main/kotlin'
    }
}

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
}

buildscript {
    ext.kotlin_version = '1.0.0-beta-4584'
    repositories {
        jcenter()
    }
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version"
    }
}
目录结构:


kotlin目录下都是.kt文件,这样就可以混合使用Java和Kotlin了。简单的例子:

    val names = arrayOf("Amy", "Alex", "Bob", "Cindy", "Jeff", "Jack", "Sunny", "Sara", "Steven")

    //筛选S开头的人名
    val sName = names.filter { it.startsWith("S") }.toList()

    //按首字母分组并排序
    val nameGroup = names.groupBy { it[0] }
            .toSortedMap( Comparator { key1, key2 -> key1.compareTo(key2) })
以下是一个使用 FFmpeg 库的示例: 1. 将 FFmpeg 库文件复制到 Android 项目的 libs 目录下。假设我们将 libavcodec.so、libavformat.so、libavutil.so、libswscale.so、libswresample.so 这些库文件放在 libs 目录下。 2. 在项目的 build.gradle 文件添加以下代码,将 FFmpeg 库文件作为本地依赖库引入: ```groovy dependencies { implementation fileTree(dir: 'libs', include: ['*.jar', '*.so']) } ``` 3. 在需要使用 FFmpeg 库的代码使用 System.loadLibrary() 方法加载 FFmpeg 库。假设我们需要使用 libavcodec.so 和 libavformat.so,那么我们可以在 MainActivity.java 添加以下代码: ```java public class MainActivity extends AppCompatActivity { static { System.loadLibrary("avutil"); System.loadLibrary("avcodec"); System.loadLibrary("avformat"); } // ... } ``` 需要根据实际情况加载所需的 FFmpeg 库文件。 4. 在使用 FFmpeg 库的代码,调用 FFmpeg 库的函数。以下是一个简单的示例,使用 FFmpeg 库打开一个视频文件并获取视频信息: ```java public class MainActivity extends AppCompatActivity { static { System.loadLibrary("avutil"); System.loadLibrary("avcodec"); System.loadLibrary("avformat"); } private static final String TAG = "MainActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 打开视频文件 AVFormatContext formatContext = new AVFormatContext(null); int ret = avformat_open_input(formatContext, "/sdcard/test.mp4", null, null); if (ret != 0) { Log.e(TAG, "avformat_open_input failed: " + ret); return; } // 获取视频信息 ret = avformat_find_stream_info(formatContext, null); if (ret < 0) { Log.e(TAG, "avformat_find_stream_info failed: " + ret); return; } // 输出视频信息 Log.i(TAG, "format: " + formatContext.iformat.long_name.getString()); for (int i = 0; i < formatContext.nb_streams; i++) { AVStream stream = formatContext.streams[i]; AVCodecParameters codecParameters = stream.codecpar; Log.i(TAG, "stream " + i + " type: " + codecParameters.codec_type); Log.i(TAG, "stream " + i + " codec name: " + avcodec_get_name(codecParameters.codec_id)); Log.i(TAG, "stream " + i + " duration: " + stream.duration); Log.i(TAG, "stream " + i + " bit rate: " + codecParameters.bit_rate); Log.i(TAG, "stream " + i + " width: " + codecParameters.width); Log.i(TAG, "stream " + i + " height: " + codecParameters.height); Log.i(TAG, "stream " + i + " sample rate: " + codecParameters.sample_rate); Log.i(TAG, "stream " + i + " channels: " + codecParameters.channels); Log.i(TAG, "stream " + i + " channel layout: " + codecParameters.channel_layout); } // 关闭视频文件 avformat_close_input(formatContext); } } ``` 需要注意的是,以上代码仅供参考,实际使用时需要根据 FFmpeg 库的版本和编译选项进行调整。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值